Descriptores gráficos
Utilizaremos:
Gráfica de dispersión para notar fácilmente como aumenta o decrece la cantidad de infectados e infectados por dia antes y después de que se aplique la medida. Además, la gráfica de dispersión nos puede ayudar a encontrar una relación y/o patrón entre la cantidad de infectados y/o movilización social y los días transcurridos desde que se empleó cada medida.
También utilizaremos un gráfico de caja de bigotes para diferenciar las edades de los entrevistados de manera rápida y efectiva. Esto nos permitirá ver la relación entre las edades y respuestas dadas por las personas.
Además, se utilizarán gráficos de barras principalmente para visualizar y analizar las respuestas cualitativas. Con los gráficos de barras se podrán ver cuales han sido las respuestas cualitativas respondidas con más y menos frecuencia.
Finalmente, se usarán histograma para describir las variables cuantitativas que pueden ser distribuidas en rangos. Esto nos facilitará analizar los datos con muchos valores o respuestas posibles.
Plots y otras cosas
# curl -Ls "$url" > df_form.csv
tmp <- tempfile()
curl_download("https://docs.google.com/spreadsheets/d/e/2PACX-1vS5FwsKHl4PhukIHfSGbfA8NCQ5SqBDpQ16KC69JCiFAWVeJ40BACp0dqhBTkHi9cpLE_JmEmIvfdvA/pub?gid=637100843&single=true&output=csv", tmp)
read_csv(tmp) -> df_form1
Parsed with column specification:
cols(
.default = col_character(),
`¿Cuál es tu edad?` = col_double(),
`¿Cuántas veces a la semana, en promedio, salías de casa durante los días de cuarentena?` = col_double(),
`Respecto a la anterior pregunta. Del 0 al 5, ¿ En cuánto disminuyó tus salidas durante la cuarentena?` = col_double(),
`Respecto a la anterior pregunta. Del 0 al 5, ¿Cuánto te desanimó salir de casa?` = col_double(),
`Respecto a la anterior pregunta. Del 0 al 5, ¿Cuánto cambio tus salidas?` = col_double(),
`Respecto a la anterior pregunta. Del 0 al 5, ¿Cuán menores fueron tus salidas?` = col_double(),
`Respecto a la anterior pregunta. Del 0 al 5, ¿Cuánto se redujo tus salidas?` = col_double(),
`Respecto a la anterior pregunta. Del 0 al 5, ¿ Cuán más te mantuviste en casa?` = col_double(),
`Respecto a la anterior pregunta. Del 0 al 5, ¿Cuánto tiempo más te mantuvo en casa?` = col_double()
)
See spec(...) for full column specifications.
# Segunda encuesta
tmp <- tempfile()
curl_download("https://docs.google.com/spreadsheets/d/e/2PACX-1vS5FwsKHl4PhukIHfSGbfA8NCQ5SqBDpQ16KC69JCiFAWVeJ40BACp0dqhBTkHi9cpLE_JmEmIvfdvA/pub?gid=637100843&single=true&output=csv", tmp)
read_csv(tmp) %>%
rename(
tiempo = "Marca temporal",
edad = "¿Cuál es tu edad?",
genero = "¿De qué género eres?",
ingreso = "¿Cuánto es el ingreso mensual promedio de tu familia aproximadamente (soles) ?",
distrito = "¿En qué distrito vives?",
estudio = "¿Cuál fue el último nivel educativo que completaste?",
empleo = "¿Cuál es tu tipo de empleo?",
salidas = "¿Cuántas veces a la semana, en promedio, salías de casa durante los días de cuarentena?",
razones = "¿Por qué razones salías durante la cuarentena?",
social.bool = "¿La medida de \"Inmovilización social\", realmente hizo que tus salidas durante toda la cuarentena fueran muy pocas?",
social.05 = "Respecto a la anterior pregunta. Del 0 al 5, ¿ En cuánto disminuyó tus salidas durante la cuarentena?",
ocio.bool = "¿ La \"Suspensión de acceso a lugares públicos: lugares de ocio, restaurantes, etc\", te desanimó salir de casa?",
ocio.05 = "Respecto a la anterior pregunta. Del 0 al 5, ¿Cuánto te desanimó salir de casa?",
noday.bool = "¿La medida \"Disposición salida de hombres y mujeres en días complementarios (lunes-miércoles-viernes / martes-jueves-sábados)\", garantizo que salieras menos que antes?",
noday.05 = "Respecto a la anterior pregunta. Del 0 al 5, ¿Cuánto cambio tus salidas?",
multa.bool = "¿ La medida \"Multa de S/.86 -S/.340 para todas las personas que desobedecen disposiciones del gobierno\", hizo que tus salidas de casa fueran menores?",
multa.05 = "Respecto a la anterior pregunta. Del 0 al 5, ¿Cuán menores fueron tus salidas?",
bono.bool = "¿ La medida \"Entrega de bono S/. 380, S/.760 de acuerdo al Sistema de Focalización de Hogares (SISFOH) \", permitió que redujeras tus salidas de casa?",
bono.05 = "Respecto a la anterior pregunta. Del 0 al 5, ¿Cuánto se redujo tus salidas?",
afp1.bool = "¿ La medida \"Retiro de hasta S/. 2000 de fondos AFP de trabajadores afiliados que no tienen planilla\", te mantuvo más tiempo en casa?",
afp1.05 = "Respecto a la anterior pregunta. Del 0 al 5, ¿ Cuán más te mantuviste en casa?",
afp2.bool = "¿ La medida \"Retiro del 25% de fondos AFP para trabajadores afiliados\", te mantuvo más tiempo en casa?",
afp2.05 = "Respecto a la anterior pregunta. Del 0 al 5, ¿Cuánto tiempo más te mantuvo en casa?",
decceleration = "¿Qué condiciones crees que existen en tu distrito que retardan la propagación del Covid?",
acceleration = "¿Qué condiciones crees que existen en tu distrito que aceleran la propagación del Covid?"
) %>%
mutate(
genero = as.factor(genero),
ingreso = as.factor(ingreso),
distrito = as.factor(distrito),
estudio = factor(estudio, levels = c("Secundaria", "Técnica", "Universitaria", "Posgrado")),
empleo = factor(empleo, levels = c("No trabajo", "Informal", "Formal")),
# Esteban Nicolas Villacorta Garcia cambió las respuestas de la encuesta
# de "Mayor 5" a 6.
salidas_ = salidas,
salidas = replace(salidas, salidas=="6", "Mayor 5"),
salidas = factor(salidas, levels = c(0:5, "Mayor 5")),
razones = strsplit(razones, ", "),
social.bool = social.bool == "Sí" | social.bool == "Si",
ocio.bool = ocio.bool == "Sí" | ocio.bool == "Si",
noday.bool = noday.bool == "Sí" | noday.bool == "Si",
multa.bool = multa.bool == "Sí" | multa.bool == "Si",
bono.bool = bono.bool == "Sí" | bono.bool == "Si",
afp1.bool = afp1.bool == "Sí" | afp1.bool == "Si",
afp2.bool = afp2.bool == "Sí" | afp2.bool == "Si",
acceleration = strsplit(acceleration, ", "),
decceleration = strsplit(decceleration, ", ")
) -> df_form2
Parsed with column specification:
cols(
.default = col_character(),
`¿Cuál es tu edad?` = col_double(),
`¿Cuántas veces a la semana, en promedio, salías de casa durante los días de cuarentena?` = col_double(),
`Respecto a la anterior pregunta. Del 0 al 5, ¿ En cuánto disminuyó tus salidas durante la cuarentena?` = col_double(),
`Respecto a la anterior pregunta. Del 0 al 5, ¿Cuánto te desanimó salir de casa?` = col_double(),
`Respecto a la anterior pregunta. Del 0 al 5, ¿Cuánto cambio tus salidas?` = col_double(),
`Respecto a la anterior pregunta. Del 0 al 5, ¿Cuán menores fueron tus salidas?` = col_double(),
`Respecto a la anterior pregunta. Del 0 al 5, ¿Cuánto se redujo tus salidas?` = col_double(),
`Respecto a la anterior pregunta. Del 0 al 5, ¿ Cuán más te mantuviste en casa?` = col_double(),
`Respecto a la anterior pregunta. Del 0 al 5, ¿Cuánto tiempo más te mantuvo en casa?` = col_double()
)
See spec(...) for full column specifications.
df_form2
Edad de la muestra
summary(df_form2$edad)
Min. 1st Qu. Median Mean 3rd Qu. Max.
17.0 22.0 28.0 33.4 45.0 67.0
boxplot(df_form2$edad, xlab = "", ylab = "Edad", main=NULL)
title("Gráfico 1. Edad")

\[n = 310, sd = 12.619\]
Género
df_form2 %>%
group_by(genero) %>%
summarise(n = n()) %>%
barplot(n~genero, data=., xlab="Personas", ylab="Cantidad")
title("Gráfico 2. Género")

Ingreso promedio
par(mai = c(0.8, 1.5, 0.2, 0.5))
df_form2 %>%
group_by(ingreso) %>%
summarise(n = n()) %>%
barplot(n~ingreso, data=., horiz = TRUE, las = 2, xlab = "Personas", ylab="")
title(ylab="Ingreso", line=6)
title("Gráfico 3. Ingresos")

Distrito
par(mai = c(1, 2, 0.5, 0.5))
#plot(edad~distrito, data = df_form2, horizontal=TRUE, las=2, xlab="")
#title(ylab="Distrito", line=8)
df_form2$distrito %>%
table() %>%
sort(TRUE) %>%
barplot(horiz = TRUE, las = 2, xlab = "Personas", ylab="")
title("Gráfico 4. Distrito")

Empleo
par(mai = c(1, 1.5, 0.5, 0.5))
df_form2$empleo %>%
table() %>%
sort(TRUE) %>%
barplot(horiz = TRUE, las = 2, xlab = "Personas", ylab="")
title("Gráfico 5. Tipo de trabajo")

¿Qué tanto varían las cifras de nuevos infectados durante los periodos de instauración previos-posteriores a la medida?
Para esta primera pregunta se han procesado los datos web. Se presentarán dos gráficos por cada una de las cuatro medidas que se analizarán. El primero de ellos será de los nuevos casos y el segundo de la movilización recreacional (cambios en la movilización). Los descriptores que se están utilizando para describir mejor los datos obtenidos es la media y mediana. Es necesario destacar que se ha optado por graficar los datos diez días antes de que se decrete la medida y diez días después de haberse promulgado.
Declaración del Estado de Emergencia
En esta gráfica podemos visualizar que la cantidad de infectados por día bajó en algunos días inmediatamente después de que se declarará el estado de emergencia. Se puede apreciar en la gráfica que se lleva a cabo cada 2 o 3 días durante la semana siguiente a la implementación del Estado de Emergencia. Esto se podría deber a factores como la cantidad de pruebas tomadas por día, frecuencia de salida de las personas y el cumplimiento de las leyes y medidas tomadas.
Nuevos casos 03-05 -> 03-25
plot_new_cases("2020-03-05", "2020-03-25")

.
Para analizar esta gráfica, se asume que el crecimiento de la enfermedad bajo condiciones normales es exponencial. Por tanto, se puede construir un modelo tal que: ln(y) ~ At+B. Tomando a L1 como regresión de control sin variable independiente y L2 la regresión luego de aplicarse la medida, se realizó un F-test para comprobar si el modelo L1 modela a L2 sin diferencias significativas.
- Ho : No existen diferencias significativas entre ambos modelos.
- Ha : Existen diferencias significativas entre el modelo anterior a la medida y el actual.
|
Variable 1 |
Variable 2 |
| — |
———- |
—— |
| Mean |
1.55950355 |
3.603577946 |
| Variance |
1.30751423 |
0.201678854 |
| Observations |
10 |
9 |
| df |
9 |
8 |
| F |
6.48314984 |
|
| P (F <= f) one-tail |
0.00746629 |
|
| F crítico one-tail |
3.38813023 |
|
| — |
———- |
—— |
Dado que la varianza 1 > varianza 2, la elección del orden de las variables es correcta. Por tanto, dado F > F crítico, se encuentra evidencia para falsear Ho. Dado α > P(F<=f) una cola, se rechaza la hipótesis nula, por lo que existen diferencias significativas. Comparando las pendientes A1=0.337 y A2=0.0729 con A2 <A1, se puede asumir que se frenó la expansión de la enfermedad.
Movilización recreacional 03-05 -> 03-25
plot_rmoves("2020-03-05", "2020-03-25")

.
A partir del gráfico 7, se logra visualizar que previo a la promulgación de la medida “Declaración de Estado de Emergencia”, la gente tenía mucha más movilización y luego de decretada, el cambio de movilización disminuyó en gran medida. El promedio y mediana (líneas continuas) antes de que se aplique esta medida es aproximadamente -3. Por otro lado, el promedio y mediana (líneas punteadas) desde el quince hasta el veinticinco está por debajo de -60.
Para comprobar la significancia de esta diferencia, se realizó un test-t de medias. Se asumieron las siguientes hipótesis:
- Ho : No existe un efecto significativo de la medida por sobre las medias del Cambio de Movilización.
- Ha : Existen diferencias significativas entre las medias de la variable Cambio de Movilización para antes y después de ejecutarse la medida.
|
Variable 1 |
Variable 2 |
| — |
———- |
—— |
| Mean |
-3.363636364 |
-71.1818182 |
| Variance |
15.65454545 |
113.363636 |
| Observations |
11 |
11 |
| df |
13 |
|
| t Stat |
19.8023634 |
|
| P (T <= t) one-tail |
2.15261E-11 |
|
| t crítical one-tail |
1.770933396 |
|
| P (T <= t) two-tail |
4.30521E-11 |
|
| t crítical two-tail |
2.160368656 |
|
| — |
———- |
—— |
Dado que el valor |t| > t-crítico dos colas, se puede encontrar evidencia para rechazar la hipótesis nula Ho. Dado α =0.05 > P(T<=t) dos colas, existe significancia suficiente para ello. Por tanto, se rechaza Ho, existiendo por tanto diferencias significativas entre antes de ejecutarse la declaración de Estado de Emergencia y después sobre la movilización de las personas. Debido a que el coeficiente de correlación es menor a 0, se puede afirmar que el cambio además redujo la movilización.
Aprobación del Padrón de Hogares
Este gráfico nos muestra la cantidad de casos diez días antes y diez días después de que la medida “Aprobación del Padrón de Hogares” fuera aprobada. Esta es una gráfica muy importante, dado que tenía como objetivo ayudar a las poblaciones más vulnerables en condición de extrema pobreza a nivel nacional para que pudieran subsistir durante la cuarentena. Dicho en otras palabras, para que pudieran acceder a los servicios básicos y medicamentos, en caso fuesen requeridos. La cantidad de casos antes de que la medida fuese declarada, 08/03 hasta 18/03, va desde aproximadamente uno hasta veinte. No obstante, desde 18/03 hasta 28/03 la cantidad de casos va en aumento. Sin duda alguna, el objetivo era bueno, pero para el panorama que se estaba viviendo no fue efectiva. Una posible hipótesis sería la salida obligatoria de los beneficiarios a los bancos a formar largas colas durante horas. Esto explicaría el aumento de casos.
Nuevos casos 03-08 -> 03-28
plot_new_cases("2020-03-08", "2020-03-28")

.
Se realizó un f-test sobre los inputs a la regresión lineal del logaritmo de la gráfica, siguiendo el modelo planteado arriba. Se colocó como control a todos los datos previos a declararse la medida. Se plantearon las siguientes hipótesis:
- Ho : No existe un efecto significativo de la medida por sobre la tendencia de los nuevos casos con respecto al control.
- Ha : Existen un efecto significativo entre las muestras de control y la data posterior a la declaración.
|
Variable 1 |
Variable 2 |
| — |
———- |
—— |
| Mean |
1.538879 |
3.218122 |
| Variance |
0.949329 |
0.148907 |
| Observations |
10 |
10 |
| df |
9 |
9 |
| F |
6.375321 |
|
| P (F <= f) one-tail |
0.008398 |
|
| F crítico one-tail |
3.438101 |
|
| — |
———- |
—— |
Dado que la primera varianza es mayor a la segunda, el orden de operación de los datos es correcto. Como tal, dado F > F-critico una cola, encontramos evidencia en contra de Ho. Dado ademas P(F<=f) < α , se puede garantizar la decisión de rechazar la hipótesis nula, por lo que deben existir diferencias significativas entre los datos. Dado además A1= 0.2672 > A2=0.0116, se puede afirmar que la medida redujo la tasa de infección.
Movilización recreacional 03-08 -> 03-28
plot_rmoves("2020-03-08", "2020-03-28")

.
Esta gráfica, al igual que la Gráfica 7, manifiesta un comportamiento similar. Sin embargo, a partir de la disminución de la curva se podrían generar algunas conjeturas. La primera de ellas es que las personas tenían un respaldo para poder comprar sus alimentos y medicamentos de ser necesario por lo que ya no tenían que salir a las calles de manera concurrida a vender productos, entre otras cosas. Cabe resaltar que con esto no queremos decir que la población no salía y que la medida fue 100% efectiva. Al contrario, la población objetivo salió para hacer el retiro del subsidio por lo que el número de casos aumentó. Sin embargo, esto también contribuyó a que en días posteriores se queden en casa, debido a que contaban con dinero para subsistir por un par de semanas más (varía según el número de integrantes). Estas afirmaciones se respaldan con la media y mediana antes del decreto (líneas continuas), dado que se ubica en la parte superior del gráfico, mientras que la media y mediana (líneas punteadas) por debajo de -60.
Utilizando un test-t para medias en ambas secciones de la gráfica, podemos determinar si existe un efecto de la medida por sobre la trend general.
- Ho : No existen diferencias significativas entre ambas secciones de la gráfica.
- Ha : Existen diferencias significativas entre ambas secciones de la gráfica.
|
Variable 1 |
Variable 2 |
| — |
———- |
—— |
| Mean |
-9.33333333 |
-74.5 |
| Variance |
135 |
5.388888889 |
| Observations |
9 |
10 |
| Hypothesized Mean Difference |
0 |
|
| df |
9 |
|
| t Stat |
16.53162428 |
|
| P(T <= t) one - tail |
2.41781E-08 |
|
| t Critical one - tail |
1.833112933 |
|
| P(T <= t) two - tail |
4.83563E-08 |
|
| t Critical two - tail |
2.262157163 |
|
| — |
———- |
—— |
Dado que el estadístico |t| > t-crítico dos colas, se encuentra evidencia para falsear la hipótesis nula. Dado que P(T<=t) < α, la elección es justificable, por lo que se rechaza la hipótesis nula, concluyendo por tanto que existe una diferencia significativa entre ambas secciones de la gráfica. Debido a que la correlación es negativa, se concluye que la medida redujo la movilizacion recreacional.
Salida alternada por género
El gráfico 10 exhibe la cantidad de casos antes y después de aplicarse la medida “Salida alternada por género”. En un primer momento esta medida tenía como objetivo disminuir el número de contagios. Por tal razón, el Gobierno decretó determinados días de salida para mujeres y otros para varones, y los domingos nadie salía. No obstante, a partir de la representación se puede observar que el número de casos aumentó de aproximadamente cien a mil cien casos. Después de los reportajes vistos, podríamos tratar de explicar este comportamiento basándonos en lo siguiente: las mamás consideran que los varones (esposos) no saben hacer las compras de mercado. Algunos dirían que esto no tiene fundamento, pero analizando detalladamente los reportajes, pudimos reconocer que en los días de salida de mujeres había mucha más aglomeración y desorden, a diferencia de los días en que les tocaba salir a los varones.
Nuevos casos 03-24 -> 04-13
plot_new_cases("2020-03-24", "2020-04-13")

.
Para comprobar estadísticamente si es que la medida fue efectiva o no, se realizó el test F sobre la forma logarítmica de la regresión. Debido a que la regresión no se centra en 0, se normalizaron los puntos previamente.
- Ho : No existe diferencias significativas entre los dos sets de puntos.
- Ha : Existe diferencias significativas entre el set de puntos antes y despues de aplicarse la medida.
|
Variable 1 |
Variable 2 |
| — |
———- |
—— |
| Mean |
4.820939 |
6.666542 |
| Variance |
0.366808 |
0.140169 |
| Observations |
10 |
10 |
| df |
9 |
9 |
| F |
2.616901 |
|
| P (F <= f) one-tail |
0.150944 |
|
| F crítico one-tail |
4.772466 |
|
| — |
———- |
—— |
Dado que F < F-crítico una cola, no se puede falsear la hipótesis nula. Además, comoP(F<=f) una cola > 0.05, se decide mantener la hipótesis nula, considerando que no existen diferencias significativas. Con esto, se comprueba que la medida no tuvo éxito en reducir los nuevos casos.
Movilización recreacional 03-24 -> 04-13
plot_rmoves("2020-03-24", "2020-04-13")

.
Se puede observar un leve cambio en la posición de las medias de ambos datasets. Para comprobar la significancia de esta diferencia, se plantea un test-t. Asumiendo:
|
-75 |
-76 |
| — |
———- |
—— |
| Mean |
-74.1111 |
-85.3333 |
| Variance |
0.923611 |
69 |
| Observations |
9 |
9 |
| Pearson Correlation |
-0.68635 |
|
| Hypothesized Mean Difference |
8 |
|
| df |
8 |
|
| t Stat |
1.074858 |
|
| P(T <= t) one - tail |
0.156892 |
|
| t Critical one - tail |
1.859548 |
|
| P(T <= t) two - tail |
0.313784 |
|
| t Critical two - tail |
2.306004 |
|
| — |
———- |
—— |
Dado que |tStat| < t critico dos colas, no se puede encontrar evidencia que niegue Ho. Dado además que P(T<=t) > α, no se llega a rechazar la hipótesis nula, por lo que se asume que no existen diferencias significativas tras la medida.
A partir de este gráfico se puede observar una similitud en el comportamiento con todos los demás analizados hasta este punto. Si bien es cierto las tres medidas funcionan bien para disminuir la movilización, pero con el nivel de casos de Covid-19 sucede lo contrario, dado que estos aumentan de manera significativa. Es necesario destacar que hay fechas en las que disminuye y otras en las que aumenta. No obstante, un cambio notorio sucede a partir del 6 de abril, donde la movilización está por debajo de -90 aproximadamente. El cambio de movilización puede estar fundamentada porque parte de la población no salía el mismo día. Pero, si disminuyó la movilización ¿por qué aumentaron los casos? Para responder esta pregunta, nos basaremos en el gráfico anterior, donde objetamos que las madres no pueden dejar el control o confianza a sus esposos para que se encarguen de la dispensa. La mayoría optaba por salir a comprar un día hábil y la misma aglomeración, desorden y el no distanciamiento contribuye a la aceleración de la propagación del virus.
Permiso de adquisición de bienes y servicios básicos
En el gráfico número 12 hay una observación muy poco evidente que se puede ver. Pocos días anteriores a la implementación de la medida en consideración, los nuevos casos empezaron a incrementar después de haberse mantenido relativamente constantes por un tiempo. El incremento de estos nuevos casos al parecer fue controlado por unos dias posteriores de ser tomada la medida. Sin embargo, en la gráfica se puede visualizar que aproximadamente una semana después de haberse tomado esta medida los casos empezaron a incrementar nuevamente.
Nuevos casos 04-10 -> 04-30
plot_new_cases("2020-04-10", "2020-04-30")

.
Para comprobar la significancia de esta diferencia, se plantea un test-f. Asumiendo a los puntos ubicados antes de la aplicación de la medida como control:
|
Variable 1 |
Variable 2 |
| — |
———- |
—— |
| Mean |
0.162215 |
0.865875 |
| Variance |
0.079739 |
0.076307 |
| Observations |
10 |
10 |
| df |
9 |
9 |
| F |
1.044967 |
|
| P (F <= f) one-tail |
0.475961 |
|
| F crítico one-tail |
1.739606726 |
|
| — |
———- |
—— |
Dado F < F-crítico una cola, no se encuentra evidencia en contra de la hipótesis nula. Como P(F<=f)>0.05, no se rechaza Ho, asumiendo por tanto que no existen diferencias significativas en el ratio de aparición de nuevos casos.
Movilización recreacional 04-10 -> 04-30
plot_rmoves("2020-04-10", "2020-04-30")

.
En esta gráfica podemos ver que la medida de permiso de adquisición de bienes y servicios básicos no afectó de manera evidente la movilización social, ya que no se puede ver una reducción o incremento totalmente claro en los días posteriores a la implementación de esta medida. Se puede observar esto mediante un t-test. Asumiendo así:
|
Variable 1 |
Variable 2 |
| — |
———- |
—— |
| Mean |
-80.4 |
-76.6 |
| Variance |
68.21111111 |
37.82222222 |
| Observations |
10 |
10 |
| Hypothesized Mean Difference |
0 |
|
| df |
17 |
|
| t Stat |
-1.166977249 |
|
| P(T <= t) one - tail |
0.129664399 |
|
| t Critical one - tail |
1.739606726 |
|
| P(T <= t) two - tail |
0.259328799 |
|
| t Critical two - tail |
2.109815578 |
|
| — |
———- |
—— |
Dado que |t| < t-crítico, no se puede solventar la idea de rechazar la hipótesis directamente. Dado además que P(T<t) > α , no se llega a rechazar completamente Ho, por lo que se asume que no existen diferencias significativas.
¿Cuáles eran las razones por las que la población salía durante la cuarentena?
Razones
df_form2$razones %>% unlist() %>% table() -> razones_t
wordcloud(names(razones_t), as.vector(razones_t), min.freq = 2)
title("Gráfico 14. Razones para salir durante la cuarentena")

El gráfico anterior manifiesta algunas de las razones que justifican las salidas de casa de la población encuestada durante la cuarentena. Es necesario destacar que esta gráfica se relaciona mucho con la gráfica 6,8,10 y 12, dado que explicaría de algún u otro modo el aumento de casos. La razón con mayor porcentaje es la comida, la que le continúa son los medicamentos y por último el trabajo.
Frecuencia de salida
df_form2 %>%
group_by(salidas) %>%
summarise(n=n()) %>%
barplot(n~salidas, data=., ylab = "Personas", xlab="Salidas")
title("Gráfico 15. Salidas por semana")

Este gráfico se relaciona mucho con el anterior, dado que exhibe las salidas por semana de la población muestra. La gráfica contiene un punto máximo en 2, además de otro máximo local en 5. La media y la mediana son 3.06 y 3 respectivamente, lo que provee un buen estimador de las salidas promedio de las personas encuestadas.
Frecuencia de salida VS Ingresos
ggplot(aes(x =salidas_, y = ingreso, group=ingreso), data = df_form2) +
geom_boxplot() +
ggtitle("Salidas vs ingresos") +
theme(plot.title = element_text(hjust = 0.5))

Para el rango más bajo de ingresos [0-1000] soles, de acuerdo a la caja de bigotes, se obtuvo una mediana de 2 en la frecuencia de salida. Esto evidencia que casi el 50% incide en salir menos de 2 veces y el otro 50% sale más de 2 veces. Para el rango más alto de ingresos [>10000] la mediana es 3. Ello representa que el 50% incide en salir más de 3 veces. Los ingresos entre ambos rangos muestran una frecuencia de salida menor, la cual favorece en mediana a salidas menores que 3 y 2. A medida que incrementan los ingresos no se evidencia un comportamiento definido para las frecuencias de salida, pero si un favorecimiento a menores salidas que el rango más bajo de ingresos. La única excepción se da para el rango más alto de ingresos.
ggplot(aes(x=salidas_, y=ingreso, group=salidas_), data = df_form2) +geom_count()

Esta segunda gráfica muestra la cantidad de observaciones por ingreso y frecuencia de salida. Se observa que para 0 salidas , a medida que aumentan los ingresos menos personas inciden en esta. El mismo comportamiento se da para 1 salida, 5 salidas. Es similar el comportamiento para 2,3,6 salidas solo que existen variaciones más notorias. Asimismo, se muestra que los rangos más bajos de ingresos [0,1000],[1000,2000) presentan mayor cantidad de observaciones de 0 a 6 salidas.
#Frecuencia de salida vs. Edad
ggplot(aes(x = salidas_, y = edad, group = salidas_), data = df_form2) + geom_boxplot() + ggtitle("Salidas vs edad") + theme(plot.title = element_text(hjust = 0.5))

Esta gráfica muestra que las medianas de las edades cambian ligeramente con la frecuencia de salida. Para 0 salidas hay personas 18-32 años que abarcan 25% y 75% del total. Para 1 salida existen personas con más edad de 25- 45 años que ocupan el rango intercuartílico. Para 2,3 salidas se mantiene ese rango de edades y la mediana cambia casi nada. Para 5,6 salidas la mediana no aumenta ni disminuye significativamente. Un aumento de la mediana a medida que aumenta la frecuencia de salida implicaria que en cada frecuencia de salida casi el 50% lo ocupen personas de más edad que la anterior frecuencia de salida. Dado que no sucede esto, se evidencian distribuciones algo similares.
ggplot(aes(y = salidas_, x = genero, group = genero), data = df_form2 ) + geom_count() + ggtitle("Género vs salidas") + theme(plot.title = element_text(hjust = 0.5))

La gráfica muestra que las observaciones son mayores para el género masculino. Los hombres, entre 1-3 salidas inciden más, las mujeres de igual forma inciden más en 1-3 salidas. Para las mujeres, la cantidad de observaciones incrementa de 0-1 salida, entre 1-3 salidas la cantidad de observaciones es la misma , luego a medida que incrementan las salidas la cantidad de observaciones disminuye. Para los hombres, la cantidad de observaciones incrementa entre 0-2 salidas, luego a medida que aumentan las salidas, la cantidad disminuye y vuelve a aumentar. Existe mayor dispersión para más de 3 salidas.
ggplot(aes(y = salidas_, x = empleo, group = empleo), data = df_form2 ) + geom_count() + ggtitle("Tipo_trabajo vs salidas") + theme(plot.title = element_text(hjust = 0.5))

La cantidad de observaciones es mayor para las personas con un trabajo formal. Estas tienen mayor variación en la cantidad de observaciones a medida que aumentan las salidas. Para las personas con un trabajo informal, existe una menor variación en la cantidad de observaciones.
¿Cuáles han sido las medidas que han tenido mayor impacto en la población?
Medidas
par(mai = c(1, 2.5, 0.5, 0.5))
(table(c(
rep("Inmovilización", length(which(df_form2$social.bool))),
rep("No acceso a lugares públicos", length(which(df_form2$ocio.bool))),
rep("Salida intercalada", length(which(df_form2$noday.bool))),
rep("Bono", length(which(df_form2$bono.bool))),
rep("Un monto del Afp", length(which(df_form2$afp1.bool))),
rep("Un porcentaje del Afp", length(which(df_form2$afp2.bool)))
))/length(df_form2$social.bool)) %>%
sort(TRUE) %>%
barplot(horiz = TRUE,
las = 1,
ylab = "",
xlab = "Aprobación"
)
title("Gráfico 16. Aprobación por medida (de 0 a 1)")

El gráfico 16 muestra el nivel de aprobación de las medidas que se están estudiando. No obstante, también se han incluido dentro del padrón de hogares el monto de AFP y un porcentaje del mismo. Con un nivel de aprobación mayor a 0.8, la población optó por la medida “Declaración de Estado de Emergencia”. Desde el punto de vista de la población la inmovilización contribuyó en mayor medida. El segundo lugar es para el no acceso a lugares públicos, es decir el permiso para la adquisición de bienes y servicios básicos. Luego, con una aprobación menor a 0.6 las salidas por género. Finalmente, la aprobación del Padrón de Hogares con una aprobación de 0.2 aproximadamente.
Edad -> Frecuencia de salida
Pruebas de Hipótesis:
datos.f <-as.character(df_form2$salidas)
datos.n<-replace(datos.f,datos.f=="Mayor 5","6")
datos.n<-as.integer(datos.n)
edad_frec <- data.frame(df_form2$edad,datos.n)
edad_frec
plot(datos.n~df_form2.edad,data = edad_frec, xlab="edad", ylab="frecuencia de salida")
edad_frec_lm <- lm(datos.n~df_form2.edad, data =edad_frec )
abline(edad_frec_lm)

cor(x = df_form2$edad , y =(datos.n), method = "pearson")
[1] 0.01262241
La gráfica del modelo muestra que el comportamiento de la variable dependiente es casi constante a lo largo de la edad, es decir, no hay cambios signifcativos en la frecuencia de salida tras un aumento o disminución de la edad. Respecto a la nube de puntos, existen muchos puntos alejados al ajuste de regresión lineal y se dispersan variablemente a medida que aumenta la edad.
El coeficiente de correlación de pearson para estas variables es muy bajo y positivo. Una mayor edad es 0.012 asociada a una mayor frecuencia de salida, es decir, presentan un grado de asociación muy debil. Esto significa que una mayor edad no implica una mayor frecuencia de salida. Para corroborar ello se analiza los coeficientes del modelo, se describe y analizan los residuos del modelo.
summary(edad_frec_lm)
Call:
lm(formula = datos.n ~ df_form2.edad, data = edad_frec)
Residuals:
Min 1Q Median 3Q Max
-2.5345 -1.4733 -0.4749 0.5251 3.5331
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 2.437878 0.242263 10.063 <2e-16 ***
df_form2.edad 0.001610 0.006742 0.239 0.811
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Residual standard error: 1.694 on 358 degrees of freedom
Multiple R-squared: 0.0001593, Adjusted R-squared: -0.002634
F-statistic: 0.05705 on 1 and 358 DF, p-value: 0.8114
Se obtuvo un modelo con pendiente muy baja, con un p-valor mayor a la significancia establecida, por lo que no se rechaza la hipótesis nula de que este valor sea 0, es cercano a 0. Respecto al intercepto, cuando la edad es 0, el p_valor es mucho menor a la significancia establecida, por lo que se rechaza la hipótesis nula que sea 0, es 2.437 veces de salida. El coeficiente de determinación indica que el 0.000153 % de variación de las frecuencias de salida se puede explicar por la edad. Es muy bajo y por tanto coincide con el bajo grado de asociación de las variables.
#Analisis de residuos
plot(edad_frec_lm)




En la primera gráfica de los residuos Vs. los valores ajustados , se observa que la media de los residuos se desvía de 0 a lo largo de los valores ajustados. De la misma manera, se observa una dispersión variable a lo largo de los valores ajustados, es decir, no hay homocedasticidad. Al inicio, se observa que los residuos debajo de 0 son mayores que los que se encuentran encima de 0, la distribución de los puntos no es simétrica. En el medio, existe mayor dispersión encima de 0, al final es aún más notaria esa dispersión. Ello indica que los residuos del modelo se están dispersando de tal forma que no se distribuyen como una variable normal. Dado que los errores no siguen una distribución normal, se puede afirmar que el ajuste como regresión lineal no es buena aproximación para explicar como cambia la frecuencia a partir de la edad.
En la segunda gráfica residuos estandarizados Vs. cuantiles teóricos, se observa que a medida que incrementan los quantiles teóricos, existen muchos residuos que inciden en el mismo valor y alguno de estos se alinean a la recta de los cuantiles teóricos. Esto se debe a que la variable dependiente del modelo, algunas veces se repite para cada edad. Llega un momento en el que los errores estandarizados se desalinean completamente de la recta. Esto se debe a que existen saltos en el valor de la variable dependiente que el error estandarizado no ajusta porque los datos no siguen el comportamiento de una regresión lineal. La idea de explicar una mayor frecuencia de salida con una mayor edad no es correctamente ajustada ya que existe evidencia que los datos no siguen esta tendencia.
A partir de la evidencia estadística, se afirma que el modelo de regresión lineal que buscaba explicar la frecuencia de salida mediante la edad no resulta una buena aproximación. Por lo tanto se rechaza la H0. Las razones están directamente relacionadas al comportamiento de los datos recolectados. Durante la descripción de la edad en base a las frecuencias de salida se observó que las distribuciones de las edades no eran muy diferentes, algunas coincidían cada vez que incrementaba la frecuencia de salida. Se debe a que los encuestados con más edad a veces salían más que menos, de igual forma sucedía con los de menos edad, no se evidenciaba claramente una tendencia definida. Se comprobó esta afirmación también, mediante prueba de hipótesis de la media de la muestra, en el cual no se rechazo la hipótesis nula de que las personas menores de 25 años no necesariamente tenían menores salidas, debido a que la media de ellos era mayor que la media de la muestra y el p_valor resultaba mayor que la significancia, lo cual implicaba que habían personas menores de 25 años que salían más que el promedio de la muestra.
Ingresos -> frecuencia de salida
Pruebas de Hipótesis:
#df_form2
(1000 * (as.numeric(df_form2$ingreso) - 1)) -> x
as.numeric(df_form2$salidas) - 1 -> y
ingresos_frec=lm(y~x)
plot(y~x, xlab="Ingresos mensuales", ylab="frecuencia de salida")
abline(ingresos_frec)

cor(x, y, method="pearson")
[1] -0.05150849
La tendencia muestra un leve decrecimiento en la frecuencia de salida al aumentar los ingresos. Se observa que existen de más a menos puntos alejados del ajuste lineal a medida que incrementan los ingresos mensuales. Del mismo modo, existe una dispersión variable de la nube de puntos a medida que incrementan los ingresos mensuales.
El coeficiente de correlación de pearson es negativo y bajo, esto significa que el grado de asociación de las variables es bajo. Es decir, menores frecuencias de salida se asocia un -0.05150849 a mayores ingresos mensuales. Para corroborar ello se analiza los coeficientes del modelo, se describe y analizan los residuos del modelo.
summary(ingresos_frec)
Call:
lm(formula = y ~ x)
Residuals:
Min 1Q Median 3Q Max
-2.5616 -1.3255 -0.5026 0.5565 3.7041
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 2.562e+00 1.144e-01 22.388 <2e-16 ***
x -2.952e-05 3.025e-05 -0.976 0.33
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Residual standard error: 1.692 on 358 degrees of freedom
Multiple R-squared: 0.002653, Adjusted R-squared: -0.0001328
F-statistic: 0.9523 on 1 and 358 DF, p-value: 0.3298
Se obtuvo una pendiente muy baja y negativa de -2.95 *10^(-5). El signo negativo indica que la variable dependiente en este caso , la frecuencia de salida tiende a ser menor a medida que incrementan los ingresos mensuales. La pendiente del modelo se obtuvo con p_valor mayor a la significancia establecida, por lo que no se puede rechazar la hipótesis nula de que esta es 0, ya que es muy próximo a 0. Respecto al intercepto , cuando los ingresos son nulos es 2.562 veces de salida, este valor se obtuvo con un p_valor menor a la significancia establecida, por lo que se rechaza la hipótesis nula de que esta sea 0. El coeficiente de determinación del modelo indica que el 0.002653% de variación de la frecuencia de salida se puede explicar por los ingresos mensuales. El grado de exlicación establecido para las variables es muy bajo, por tanto coincide con la baja asociación de estas determinado anteriormente mediante el coeficiente de pearson.
plot(ingresos_frec)




En la primera gráfica de los residuos Vs. valores ajustados se muestra que la media de los errores se desvía de 0, ya que existe un mayor grado de dispersión debajo de 0 a medida que aumentan los valores ajustados. De la misma manera, se observa que al inicio existen mayores residuos debajo de 0 que encima de 0, en el medio también se da este comportamiento, al parecer al final los residuos son distribuidos simétricamente. Dado que la dispersión no es fija y simétrica para todos los errores a medida que se avanza en el ajuste del modelo, se puede decir que los residuos no siguen una distribución normal. Las variaciones en los residuos explican que la variable dependiente, no crece o decrece con una tendencia definida. Debido a que no siguen una distribución normal, el ajuste como regresión lineal para explicar la frecuencia de salida a partir de los ingresos no resultaría una buena aproximación.
En la segunda gráfica de los residuos estandarizados Vs. cuantiles teóricos. Se observa que inciden varios residuos estandarizados en un mismo valor, debido a que el valor de la variable dependiente algunas veces se repite. Algunos de estos residuos estandarizados se alinean a la recta de los cuartiles téoricos, algunos estan cerca, pero llega un punto en el que el alejamiento de la recta es significativo, tal que a pesar de estar estandarizado el error no ajusta el comportamiento de la regresión lineal. El valor de la variable dependiente varía de tal manera que resulta díficil ajustarlo, es por ello que los datos no siguen esta tendencia.
A partir de la evidencia estadística, se afirma que el modelo de regresión lineal que buscaba explicar la frecuencia de salida mediante los ingresos mensuales no resulta una buena aproximación. Por lo tanto se rechaza la H0. Las razones se encuentran conectadas a la parte descriptiva que se realizó para cada intervalo de ingresos, en los cuales se mostró que la distribución de las frecuencias de salida a medida que aumentaban los intervalos, resultaban menores en mediana que el intervalo o rango de [0,1000] soles, por lo que parecía favorecerse que menores frecuencias de salida estaban relacionadas con mayores ingresos. Esto se comprobó mediante una prueba de hipótesis comparando las medias entre las frecuencias de salida de aquellos con un intervalo de ingreso menor a 1000 soles y de la muestra, en esta se rechazo la hipótesis nula de que las personas con menores frecuencias de salida no necesariamente tienen ingresos mensuales mayores a 1000 soles dado que el p_valor resultó menor que la significancia establecida. Esto no daba certeza de que las personas con mayores ingresos a 1000 soles tenían menores frecuencias de salida, pero evidencia cierta tendencia a favorecer ello. Sin embargo, se observaba que existían personas que aún teniendo mayores ingreso salían más, y lo mismo sucedía con las personas que tenían menores ingresos , salían menos algunos. Esta alta variabilidad (dispersión) para las personas con ingresos mayores a 1000 soles explica porque el modelo de regresión lineal no ajusta correctamente los datos recolectados. Apesar de esto, se justifica claramente que la pendiente negativa del modelo se debe a que menores frecuencias se explican por mayores ingresos, pero que no resulta imponente ante la dispersión de los datos.
LS0tCnRpdGxlOiAiRWZlY3RvIGRlIGxhcyBtZWRpZGFzIHRvbWFkYXMgcG9yIGVsIGdvYmllcm5vIHBlcnVhbm8gZnJlbnRlIGFsIENPVklELTE5IgpvdXRwdXQ6CiAgaHRtbF9ub3RlYm9vazoKICAgIHRoZW1lOiBkYXJrbHkKICBodG1sX2RvY3VtZW50OgogICAgZGZfcHJpbnQ6IHBhZ2VkCi0tLQoKPHN0eWxlPiBib2R5IHt0ZXh0LWFsaWduOiBqdXN0aWZ5fSA8L3N0eWxlPgoKYGBge3IsZWNobz1GQUxTRSxtZXNzYWdlPUZBTFNFfQojIE5vIG9sdmlkZXMgaW5zdGFsYXIgbGFzIGRlcGVuZGVuY2lhcwpsaWJyYXJ5KGJlcnJ5RnVuY3Rpb25zKQpsaWJyYXJ5KGN1cmwpCmxpYnJhcnkodGlkeXZlcnNlKQpsaWJyYXJ5KHRtKQpsaWJyYXJ5KHdvcmRjbG91ZCkKCiMjIC0tLS0gY292aWQKdG1wIDwtIHRlbXBmaWxlKCkKY3VybF9kb3dubG9hZCgiaHR0cHM6Ly9jbG91ZC5taW5zYS5nb2IucGUvcy9ZOHczd0hzRWRZUVNaUnAvZG93bmxvYWQiLCB0bXApCgpyZWFkTGluZXModG1wKSAlPiUKICAgIGljb252KGZyb20gPSAiSVNPLTg4NTktMSIsIHRvID0gIlVURi04IikgJT4lCiAgICByZWFkX2NzdigpICU+JQogICAgbXV0YXRlKEZFQ0hBX1JFU1VMVEFETyA9IGx1YnJpZGF0ZTo6eW1kKEZFQ0hBX1JFU1VMVEFETykpIC0+IGRmCgojIyAtLS0tIG1vdmlsaXphdGlvbgp0bXAgPC0gdGVtcGZpbGUoKQpjdXJsX2Rvd25sb2FkKCJodHRwczovL3d3dy5nc3RhdGljLmNvbS9jb3ZpZDE5L21vYmlsaXR5L0dsb2JhbF9Nb2JpbGl0eV9SZXBvcnQuY3N2IiwgdG1wKQpyZWFkX2Nzdih0bXAsCiAgICAjIEVzdGEgcGFydGUgZGVqYWJhIGRlIGZ1bmNpb25hciBjYWRhIHZleiBxdWUgaGFiw61hIHVuYSBjYW1iaW8gZW4gbGFzIHZhcmlhYmxlcwogICAgY29sX3R5cGVzID0gY29scygKICAgICAgICBjb3VudHJ5X3JlZ2lvbl9jb2RlID0gY29sX2NoYXJhY3RlcigpLAogICAgICAgIGNvdW50cnlfcmVnaW9uID0gY29sX2NoYXJhY3RlcigpLAogICAgICAgIHN1Yl9yZWdpb25fMSA9IGNvbF9jaGFyYWN0ZXIoKSwKICAgICAgICBzdWJfcmVnaW9uXzIgPSBjb2xfY2hhcmFjdGVyKCksCiAgICAgICAgbWV0cm9fYXJlYSA9IGNvbF9jaGFyYWN0ZXIoKSwKICAgICAgICBpc29fMzE2Nl8yX2NvZGUgPSBjb2xfY2hhcmFjdGVyKCksCiAgICAgICAgY2Vuc3VzX2ZpcHNfY29kZSA9IGNvbF9jaGFyYWN0ZXIoKSwKICAgICAgICBkYXRlID0gY29sX2RhdGUoKSwKICAgICAgICByZXRhaWxfYW5kX3JlY3JlYXRpb25fcGVyY2VudF9jaGFuZ2VfZnJvbV9iYXNlbGluZSA9IGNvbF9kb3VibGUoKSwKICAgICAgICBncm9jZXJ5X2FuZF9waGFybWFjeV9wZXJjZW50X2NoYW5nZV9mcm9tX2Jhc2VsaW5lID0gY29sX2RvdWJsZSgpLAogICAgICAgIHBhcmtzX3BlcmNlbnRfY2hhbmdlX2Zyb21fYmFzZWxpbmUgPSBjb2xfZG91YmxlKCksCiAgICAgICAgdHJhbnNpdF9zdGF0aW9uc19wZXJjZW50X2NoYW5nZV9mcm9tX2Jhc2VsaW5lID0gY29sX2RvdWJsZSgpLAogICAgICAgIHdvcmtwbGFjZXNfcGVyY2VudF9jaGFuZ2VfZnJvbV9iYXNlbGluZSA9IGNvbF9kb3VibGUoKSwKICAgICAgICByZXNpZGVudGlhbF9wZXJjZW50X2NoYW5nZV9mcm9tX2Jhc2VsaW5lID0gY29sX2RvdWJsZSgpCiAgICApKSAlPiUKICAgIGZpbHRlcihjb3VudHJ5X3JlZ2lvbl9jb2RlID09ICJQRSIpIC0+IGRmX21vdgoKIyMgLS0tLSBpbmZlYwpkZiAlPiUKICAgIGdyb3VwX2J5KEZFQ0hBX1JFU1VMVEFETykgJT4lCiAgICBzdW1tYXJpc2UoTiA9IG4oKSkgJT4lCiAgICBhcnJhbmdlKEZFQ0hBX1JFU1VMVEFETykgJT4lCiAgICBtdXRhdGUoTlNVTSA9IGN1bXN1bShOKSkgLT4gZGZfaW5mZWMKCiMjIC0tLS0gcGxvdF9uZXdfY2FzZXMKcGxvdF9uZXdfY2FzZXMgPC0gZnVuY3Rpb24oZGF5LCBtaW5fZGF5LCBtYXhfZGF5LCBtYWluX3RpdGxlKSB7CiAgICBkZl9pbmZlYyAlPiUKICAgICAgICBmaWx0ZXIoRkVDSEFfUkVTVUxUQURPID49IG1pbl9kYXkgJiBGRUNIQV9SRVNVTFRBRE8gPD0gbWF4X2RheSkgLT4gZGZfdG1wCgogICAgZGZfaW5mZWMgJT4lCiAgICAgICAgZmlsdGVyKEZFQ0hBX1JFU1VMVEFETyA+PSBtaW5fZGF5ICYgRkVDSEFfUkVTVUxUQURPIDwgZGF5KSAtPiBkZl90bXBfYQoKICAgIGRmX2luZmVjICU+JQogICAgICAgIGZpbHRlcihGRUNIQV9SRVNVTFRBRE8gPiBkYXkgJiBGRUNIQV9SRVNVTFRBRE8gPD0gbWF4X2RheSkgLT4gZGZfdG1wX2IKCiAgICBkZl90bXAgJT4lCiAgICAgICAgcGxvdChOfkZFQ0hBX1JFU1VMVEFETywgZGF0YSA9IC4sIG1haW4gPSBtYWluX3RpdGxlLCB4bGFiID0gIkZlY2hhIiwgeWxhYiA9ICJOdWV2b3MgY2Fzb3MiKQoKICAgIG1lYW4xIDwtIG1lYW4oZGZfdG1wX2EkTikKICAgIHNlZ21lbnRzKGFzLkRhdGUobWluX2RheSktMSwgbWVhbjEsIGFzLkRhdGUoZGF5KSwgbWVhbjEsIGNvbCA9ICJyZWQiKQoKICAgIG1lZGlhbjEgPC0gbWVkaWFuKGRmX3RtcF9hJE4pCiAgICBzZWdtZW50cyhhcy5EYXRlKG1pbl9kYXkpLTEsIG1lZGlhbjEsIGFzLkRhdGUoZGF5KSwgbWVkaWFuMSwgY29sID0gImJsdWUiKQoKICAgIG1lYW4yIDwtIG1lYW4oZGZfdG1wX2IkTikKICAgIHNlZ21lbnRzKGFzLkRhdGUoZGF5KSwgbWVhbjIsIGFzLkRhdGUobWF4X2RheSkrMSwgbWVhbjIsIGNvbCA9ICJyZWQiLCBsdHkgPSAyKQoKICAgIG1lZGlhbjIgPC0gbWVkaWFuKGRmX3RtcF9iJE4pCiAgICBzZWdtZW50cyhhcy5EYXRlKGRheSksIG1lZGlhbjIsIGFzLkRhdGUobWF4X2RheSkrMSwgbWVkaWFuMiwgY29sID0gImJsdWUiLCBsdHkgPSAyKQoKICAgIGxlZ2VuZCgidG9wcmlnaHQiLCBsZWdlbmQ9YygiUHJvbWVkaW8gYW50ZXMiLCAiTWVkaWFuYSBhbnRlcyIsICJQcm9tZWRpbyBkZXNwdcOpcyIsICJNZWRpYW5hIGRlc3B1w6lzIiksCiAgICAgICBjb2w9YygicmVkIiwgImJsdWUiLCAicmVkIiwgImJsdWUiKSwgbHR5PWMoMSwxLDIsMiksIGNleD0wLjgpCn0KCiMjIC0tLS0gcGxvdF9zdW1fY2FzZXMKcGxvdF9zdW1fY2FzZXMgPC0gZnVuY3Rpb24oZGF5LCBtaW5fZGF5LCBtYXhfZGF5LCBtYWluX3RpdGxlKSB7CiAgICBkZl9pbmZlYyAlPiUKICAgICAgICBmaWx0ZXIoRkVDSEFfUkVTVUxUQURPID49IG1pbl9kYXkgJiBGRUNIQV9SRVNVTFRBRE8gPD0gbWF4X2RheSkgJT4lCiAgICAgICAgcGxvdChOU1VNfkZFQ0hBX1JFU1VMVEFETywgZGF0YSA9IC4sIG1haW4gPSBtYWluX3RpdGxlLCB4bGFiID0gIkZlY2hhIiwgeWxhYiA9ICJDYXNvcyB0b3RhbGVzIikKfQoKIyMgLS0tLSBwbG90X3Jtb3ZlcwpwbG90X3Jtb3ZlcyA8LSBmdW5jdGlvbihkYXksIG1pbl9kYXksIG1heF9kYXksIG1haW5fdGl0bGUpIHsKICAgIGRmX21vdiAlPiUKICAgICAgICBncm91cF9ieShkYXRlKSAlPiUKICAgICAgICBzdW1tYXJpc2UobW92ID0gbWVhbihyZXRhaWxfYW5kX3JlY3JlYXRpb25fcGVyY2VudF9jaGFuZ2VfZnJvbV9iYXNlbGluZSwgbmEucm0gPSBUUlVFKSkgLT4gZGZfdG1wCgogICAgZGZfdG1wICU+JSBmaWx0ZXIoZGF0ZSA+PSBtaW5fZGF5ICYgZGF0ZSA8IGRheSkgLT4gZGZfdG1wX2EKICAgIGRmX3RtcCAlPiUgZmlsdGVyKGRhdGUgPiBkYXkgJiBkYXRlIDw9IG1heF9kYXkpIC0+IGRmX3RtcF9iCiAgICBkZl90bXAgJT4lIGZpbHRlcihkYXRlID49IG1pbl9kYXkgJiBkYXRlIDw9IG1heF9kYXkpIC0+IGRmX3RtcAoKICAgIGRmX3RtcCAlPiUKICAgICAgICBwbG90KG1haW4gPSBtYWluX3RpdGxlLCB4bGFiID0gIkZlY2hhIiwgeWxhYiA9ICJDYW1iaW8gZGUgbW92aWxpemFjaW9uIikKCiAgICBtZWFuMSA8LSBtZWFuKGRmX3RtcF9hJG1vdikKICAgIHNlZ21lbnRzKGFzLkRhdGUobWluX2RheSktMSwgbWVhbjEsIGFzLkRhdGUoZGF5KSwgbWVhbjEsIGNvbCA9ICJyZWQiKQoKICAgIG1lZGlhbjEgPC0gbWVkaWFuKGRmX3RtcF9hJG1vdikKICAgIHNlZ21lbnRzKGFzLkRhdGUobWluX2RheSktMSwgbWVkaWFuMSwgYXMuRGF0ZShkYXkpLCBtZWRpYW4xLCBjb2wgPSAiYmx1ZSIpCgogICAgbWVhbjIgPC0gbWVhbihkZl90bXBfYiRtb3YpCiAgICBzZWdtZW50cyhhcy5EYXRlKGRheSksIG1lYW4yLCBhcy5EYXRlKG1heF9kYXkpKzEsIG1lYW4yLCBjb2wgPSAicmVkIiwgbHR5ID0gMikKCiAgICBtZWRpYW4yIDwtIG1lZGlhbihkZl90bXBfYiRtb3YpCiAgICBzZWdtZW50cyhhcy5EYXRlKGRheSksIG1lZGlhbjIsIGFzLkRhdGUobWF4X2RheSkrMSwgbWVkaWFuMiwgY29sID0gImJsdWUiLCBsdHkgPSAyKQoKICAgIGxlZ2VuZCgidG9wcmlnaHQiLCBsZWdlbmQ9YygiUHJvbWVkaW8gYW50ZXMiLCAiTWVkaWFuYSBhbnRlcyIsICJQcm9tZWRpbyBkZXNwdcOpcyIsICJNZWRpYW5hIGRlc3B1w6lzIiksCiAgICAgICBjb2w9YygicmVkIiwgImJsdWUiLCAicmVkIiwgImJsdWUiKSwgbHR5PWMoMSwxLDIsMiksIGNleD0wLjgpCn0KCiMjIC0tLS0gY2F0X2Z1bmN0aW9uCmNhdF9mdW5jdGlvbiA8LSBmdW5jdGlvbihmX25hbWUsIG1pbl9kYXksIG1heF9kYXkpIHsKICAgIGNhdCgiYGBge3J9XG4iKQogICAgY2F0KGZfbmFtZSkKICAgIGNhdCgiKFwiIikKICAgIGNhdChmb3JtYXQoYXMuRGF0ZShtaW5fZGF5KSwgIiVZLSVtLSVkIikpCiAgICBjYXQoIlwiLCBcIiIpCiAgICBjYXQoZm9ybWF0KGFzLkRhdGUobWF4X2RheSksICIlWS0lbS0lZCIpKQogICAgY2F0KCJcIilcbmBgYFxuXG4iKQp9CgojIyAtLS0tIGNhdF90aXRsZQpjYXRfdGl0bGUgPC0gZnVuY3Rpb24oZl90aXRsZSwgbWluX2RheSwgbWF4X2RheSkgewogICAgY2F0KCIjIyIsCiAgICAgICAgZl90aXRsZSwKICAgICAgICBmb3JtYXQoYXMuRGF0ZShtaW5fZGF5KSwgIiVtLSVkIiksCiAgICAgICAgIi0+IiwKICAgICAgICBmb3JtYXQoYXMuRGF0ZShtYXhfZGF5KSwgIiVtLSVkIiksCiAgICAgICAgIlxuIgogICAgKQp9CgojIyAtLS0tIGNhdF9wbG90CmNhdF9wbG90IDwtIGZ1bmN0aW9uKGRheSwgcmFuZ2UsICBtYWluX3RpdGxlLCBmdW4sIHRpdGxlKSB7CiAgICBtaW5fZGF5IDwtIGRheSAtIHJhbmdlCiAgICBtYXhfZGF5IDwtIGRheSArIHJhbmdlCgogICAgY2F0X3RpdGxlKHRpdGxlLCBtaW5fZGF5LCBtYXhfZGF5KQogICAgY2F0X2Z1bmN0aW9uKGJlcnJ5RnVuY3Rpb25zOjpnZXROYW1lKGZ1biksIG1pbl9kYXksIG1heF9kYXkpCgogICAgIyBQcmludCBkYXRlIGluIHRpdGxlCiAgICBkYXRlX3N0ciA8LSBwYXN0ZSgiKCIsZm9ybWF0KGFzLkRhdGUoZGF5KSwgIiVZLSVtLSVkIikgLCIpIiwgc2VwPSIiKQogICAgZnVuKGRheSwgbWluX2RheSwgbWF4X2RheSwgcGFzdGUobWFpbl90aXRsZSwgZGF0ZV9zdHIpKQogICAgYWJsaW5lKHYgPSBhcy5EYXRlKGRheSkpCgogICAgY2F0KCJcbi5cblxuXG4iKQp9CgojIyAtLS0tIHJlcGVhdF9wbG90cwpyZXBlYXRfcGxvdHMgPC0gZnVuY3Rpb24oZGF5LCByYW5nZSwgbWFpbl90aXRsZSA9ICIiKSB7CiAgICBkYXkgPC0gbHVicmlkYXRlOjp5bWQoZGF5KQogICAgY2F0X3Bsb3QoZGF5LCByYW5nZSwgbWFpbl90aXRsZSwgcGxvdF9uZXdfY2FzZXMsICJOdWV2b3MgY2Fzb3MiKQogICAgY2F0X3Bsb3QoZGF5LCByYW5nZSwgbWFpbl90aXRsZSwgcGxvdF9ybW92ZXMsICJNb3ZpbGl6YWNpw7NuIHJlY3JlYWNpb25hbCIpCn0KYGBgCgpbIVtSIENJXShodHRwczovL2dpdGh1Yi5jb20vMjAyMC0wMS1lc3QtMTkvcHJveWVjdG8vd29ya2Zsb3dzL1IlMjBDSS9iYWRnZS5zdmcpXShodHRwczovL2dpdGh1Yi5jb20vMjAyMC0wMS1lc3QtMTkvcHJveWVjdG8vYWN0aW9ucz9xdWVyeT13b3JrZmxvdyUzQSUyMlIrQ0klMjIpClshW1BwdF0oaHR0cHM6Ly9pbWcuc2hpZWxkcy5pby9iYWRnZS9Jb3NsaWRlcy1QcHQtaW5mb3JtYXRpb25hbD9sb2dvPVIpXSguL3ByZXMuaHRtbCkKWyFbR2l0SHViIGZvcmtzXShodHRwczovL2ltZy5zaGllbGRzLmlvL2dpdGh1Yi9mb3Jrcy8yMDIwLTAxLWVzdC0xOS9wcm95ZWN0by5zdmc/c3R5bGU9c29jaWFsJmxhYmVsPUZvcmsmbWF4QWdlPTI1OTIwMDApXShodHRwczovL2dpdGh1Yi5jb20vMjAyMC0wMS1lc3QtMTkvcHJveWVjdG8pCgojIFByb2Zlc29yOgoqIEpvc2UgTWlndWVsIFJlbm9tCgojIEN1cnNvOgoqIEVzdGFkw61zdGljYSB5IFByb2JhYmlsaWRhZGVzCgojIEludGVncmFudGVzCiogR8OpbmVzaXMgRmxvcmVzIEFycm95bwoqIEFuZ2VsIFNhbHZhZG9yIENhbGxlamEgQ2FzdGlsbG8KKiBFc3RlYmFuIFZpbGxhY29ydGEgR2FyY2lhCiogQWxiZXJ0byBPcG9ydG8gQW1lcwoqIFJpY2FyZG8gQXRzdWhpa28gWWFtYW1vdG8gWWFtYW1vdG8KCiMgTMOtZGVyCiogQWxiZXJ0byBPcG9ydG8gQW1lcwoKIyBJbnRyb2R1Y2Npw7NuCkVsIENPVklELTE5IGhhIHRlbmlkbyB1biBncmFuIGltcGFjdG8gYWxyZWRlZG9yIGRlbCBtdW5kbyB5IGhveSBlbiBkaWEgZXMgZsOhY2lsbWVudGUKZWwgdGVtYSBkZWwgcXVlIG3DoXMgc2UgaGFibGEuClRvZG9zIGxvcyBwYcOtc2VzIGhhbiB0b21hZG8gbWVkaWRhcyBjb24gcmVzcGVjdG8gYSBlc3RhIHBhbmRlbWlhLApzaW4gZW1iYXJnbyB1bm9zIGxhcyBoYW4gdG9tYWRvIG11eSB0YXJkZSB5IGVzdG8gc2UgaGEgdmlzdG8gYWZlY3RhZG8gZW4gbGEgZXhwYW5zacOzbgpkZWwgdmlydXMgZW4gZWxsb3MuCkVuIFBlcsO6LCBsYXMgbWVkaWRhcyBzZSBlbXBlemFyb24gYSB0b21hciByw6FwaWRhbWVudGUsCnBlcm8gdW5hIGNhbnRpZGFkIGNvbnNpZGVyYWJsZSBkZSBsYSBwb2JsYWNpw7NuIG5vIGhhIGN1bXBsaWRvIGNvbiBsYXMgaW5tb3ZpbGl6YWNpb25lcwpzb2NpYWxlcyB5IGVzdG8gc2UgaGEgdmlzdG8gcmVmbGVqYWRvIGVuIGxhIGV4cGFuc2nDs24gZGVsIHZpcnVzIGVuIGVsIHBhw61zLgrCv0PDs21vIHBvZGVtb3Mgc2FiZXIgY3XDoWxlcyBoYW4gc2lkbyBsYXMgbWVkaWRhcyBtw6FzIHJlc3BldGFkYXMgeSBwb3IgcXXDqT8KTGEgcmVzcHVlc3RhIGEgZXN0YSBwcmVndW50YSBsZSBzZXLDrWEgZGUgbXVjaGEgYXl1ZGEgYWwgZ29iaWVybm8gcGVydWFubywKeWEgcXVlIGNvbiBlc3RhIGluZm9ybWFjacOzbiBzZSBwb2Ryw61hIHNhYmVyIHF1ZSB0aXBvIGRlIG1lZGlkYXMgZGViZXLDrWEgdG9tYXIgeSBlbiBxdcOpCm1vbWVudG9zIHBhcmEgcXVlIHNlIGN1bXBsYW4gZGUgbWFuZXJhIHNhdGlzZmFjdG9yaWEuCkVzIHBvciBlbGxvIHF1ZSBudWVzdHJvIGdydXBvIGhhIGRlY2lkaWRvIGludmVzdGlnYXIgYWNlcmNhIGRlIGxhIGVmZWN0aXZpZGFkIGRlIGxhcwptZWRpZGFzIHRvbWFkYXMgeSBzdSByZWxhY2nDs24gY29uIGxhIG1vdmlsaXphY2nDs24gc29jaWFsIGRlIGxvcyBjaXVkYWRhbm9zLgoKIyBGYWN0aWJpbGlkYWQKRXN0ZSB0cmFiYWpvIGVzIGZhY3RpYmxlLCBkZWJpZG8gYSBxdWUgbGEgbWF5b3IgcGFydGUgZGUgbGEgaW5mb3JtYWNpw7NuIGxhIHBvZGVtb3MKY29uc2VndWlyIGRlIGdyw6FmaWNvcyB5YSBleGlzdGVudGVzIGNvbiByZWxhY2nDs24gYWwgQ09WSUQtMTkgZW4gUGVyw7ogeSBsYSBpbmZvcm1hY2nDs24KZmFsdGFudGUgbGEgcG9kZW1vcyBhZHF1aXJpciBhIHRyYXbDqXMgZGUgZW5jdWVzdGFzLgpBZGVtw6FzLCBsb3MgZWZlY3RvcyBkZSBsYXMgbWVkaWRhcyB0b21hZGFzIHBvciBlbCBnb2JpZXJubyBlbiBsYSBtb3ZpbGl6YWNpw7NuIHNvY2lhbCB5YQpzZSBwdWVkZW4gYW5hbGl6YXIsIGRlYmlkbyBhIHF1ZSBzdSBpbmZvcm1hY2nDs24gc2Ugb2J0aWVuZSBzb2xhbWVudGUgZMOtYXMgZGVzcHXDqXMgZGUKaW1wbGVtZW50YXJsYXMuCkZpbmFsbWVudGUsIGVzdGEgaW52ZXN0aWdhY2nDs24gc2UgcHVlZGUgbGxldmFyIGEgY2FibyBlbiBlbCB0aWVtcG8gZGFkbywKZGViaWRvIGEgcXVlIG5vIGVzIHVuIHRyYWJham8gcXVlIHJlcXVpZXJhIHRpZW1wbyBkZSBlc3BlcmEgcGFyYSBsbGVnYXIgYSBjb25jcmV0YXJzZS4KRXN0byBxdWllcmUgZGVjaXIgcXVlIGxvIHBvZGVtb3MgZW1wZXphciBpbm1lZGlhdGFtZW50ZS4KCiMgT2JqZXRpdm9zCkxhIGltcG9ydGFuY2lhIGRlIGVzdGUgZXN0dWRpbyBlc3RhZMOtc3RpY28gcmFkaWNhIGVuIGVsIGFuw6FsaXNpcyBkZSBhbGd1bmFzIGRlIGxhcwptZWRpZGFzIHF1ZSBlbCBnb2JpZXJubyBoYSBkZWNsYXJhZG8gYW50ZSBsYSBjb3l1bnR1cmEgZGVsIENvdmlkLTE5LgpFcyBpbXBvcnRhbnRlIGVzdHVkaWFyIHN1IGVmZWN0byBlbiBsYSBtb3ZpbGl6YWNpw7NuIHNvY2lhbCwKcHVlc3RvIHF1ZSBwb2Ryw61hIG90b3JnYXIgdW4gcGFub3JhbWEgbcOhcyBob2zDrXN0aWNvIHkgdmVyw61kaWNvIHNvYnJlIGxhcyBtZWRpZGFzIHF1ZQpnZW5lcmFuIHVuIGltcGFjdG8gcG9zaXRpdm8gZW4gbGEgZGVzYWNlbGVyYWNpw7NuIGRlIGxhIHByb3BhZ2FjacOzbiBkZWwKbnVldm8gdmlydXMgU2Fycy1Db1YtMi4KCiMjIE9iamVjdGl2b3MgZ2VuZXJhbGVzCiogRWwgb2JqZXRpdm8gZGUgZXN0ZSB0cmFiYWpvIGVzIGRldGVybWluYXIgZW4gcXXDqSBtZWRpZGEgbGFzIGRpZmVyZW50ZXMgYWNjaW9uZXMKcXVlIGhhIGFwbGljYWRvIGVsIGdvYmllcm5vLCBkZXNkZSBlbCBpbmljaW8gZGVsIHBlcmlvZG8gZGUgY3VhcmVudGVuYSBoYXN0YSBlbAp0aWVtcG8gZGVsIGVzdHVkaW8sICByZWR1amVyb24gZWwgaW1wYWN0byB5IGV4cGFuc2nDs24KZGVsIENvdmlkLTE5IGVuIGVsIFBlcsO6LgpRdWVyZW1vcyBhdmVyaWd1YXIgZWwgZWZlY3RvIGRlIGVzdGFzIG1lZGlkYXMgZW4gMiBkaWZlcmVudGVzIGFzcGVjdG9zLgpFc3RvcyBzb246IGxhIG1vdmlsaXphY2nDs24gc29jaWFsIHkKZGUgcXXDqSBtYW5lcmEgYWZlY3RhbiBsYSBjdXJ2YSBkZSBhdW1lbnRvIGRlIGluZmVjdGFkb3MgcG9yIGNvcm9uYXZpcnVzIGVuIFBlcsO6LgoKIyMgT2JqZXRpdm9zIGVzcGVjw61maWNvcwoqIEVzdGFibGVjZXIgbGFzIG1lZGlkYXMgYSBlc3R1ZGlhciB5IHF1ZSBlc3RhcyBzZSBlbmN1ZW50cmVuIGFsaW5lYWRhcyBhCmxhIGlubW92aWxpemFjacOzbiBzb2NpYWwuCiogRGVzYXJyb2xsYXIgaGFiaWxpZGFkZXMgZGUgY29tdW5pY2FjacOzbiBoYWNpZW5kbyB1c28gZGVsIHByb2dyYW1hIFItU3R1ZGlvIHkgZWwgbGVuZ3VhamUgZGUgUi4KKiBFc3RhYmxlY2VyIGxvcyBmYWN0b3JlcyBxdWUgZGV0ZXJtaW5hbiBsYSBwcmVzdGFjacOzbiBkZSBzZXJ2aWNpb3MgcMO6YmxpY29zIHkKc3UgcmVsYWNpw7NuIGNvbiBsYSBwcm9wYWdhY2nDs24gZGVsIHZpcnVzLgoqIEVzdGFibGVjZXIgdW5hIHJlbGFjacOzbiBlbnRyZSBlbCBib25vIHN1YnNpZGlvIHkKZWwgZGVzYWNhdG8gYSBsYSBpbm1vdmlsaXphY2nDs24gc29jaWFsLgoqIEVzdGFibGVjZXIgbGFzIHByaW5jaXBhbGVzIHJhem9uZXMgZGUgbGFzIHBlcnNvbmFzIHBhcmEKZGVzb2JlZGVjZXIgbGEgaW5tb3ZpbGl6YWNpw7NuIHNvY2lhbC4KCiMgTWFyY28gVGXDs3JpY28KCiMjIFBvYmxhY2nDs24gb2JqZXRpdm8KTGEgcG9ibGFjacOzbiBkZSBpbnRlcsOpcyBzb24gbG9zIGNpdWRhZGFub3MgcGVydWFub3MuClBhcmEgbG9ncmFyIHF1ZSBudWVzdHJhcyB1bmlkYWRlcyBtdWVzdHJhbGVzIHNlYW4gbG9zIG3DoXMgcmVwcmVzZW50YXRpdmEgcG9zaWJsZSwKaGVtb3MgZGVjaWRpZG8gZGVsaW1pdGFyIG51ZXN0cmEgcG9ibGFjacOzbiBvYmpldGl2byBhbCDDoXJlYSBkZSBMaW1hLgpFc3RvIHNlIGRlYmUgYSBxdWUgbnVlc3Ryb3MgZW5jdWVzdGFkb3Mgc2UgZW5jdWVudHJhbiBlbiBlc3RhIHpvbmEgeQpsYSBtYXlvciBjYW50aWRhZCBkZSBwb2JsYWNpw7NuIHNlIGVuY3VlbnRyYSBhcXXDrS4KCiMjIFVuaWRhZCBtdWVzdHJhbAoqIFBhcmEgbGFzIGVuY3Vlc3RhcyBudWVzdHJhIHVuaWRhZCBtdWVzdHJhbCBzb24gbG9zIGFsdW1ub3MgZGUgbGEgVW5pdmVyc2lkYWQgVVRFQyB5IHN1cyBmYW1pbGlhcyBbMTggLSA1MCBhw7Fvc10KKiBDb24gcmVzcGVjdG8gYSBsb3MgZGF0b3MgeSBncsOhZmljb3MgYnJpbmRhZG9zIHBvciBsYSB3ZWIsIG51ZXN0cmEgdW5pZGFkIG11ZXN0cmFsIGVzIGxhIGNpdWRhZCBkZSBMaW1hLgoqIEFjY2VkZXJlbW9zIGEgbGFzIG9ic2VydmFjaW9uZXMgeS9vIG1lZGljaW9uZXMgZGUgbGFzIHVuaWRhZGVzIG11ZXN0cmFsZXMgbWVkaWFudGUKZnVlbnRlcyBkZSBpbnRlcm5ldCBxdWUgcHJlc2VudGFuIGZpYWJpbGlkYWQsIHJlc3BhbGRvIGRlbCBnb2JpZXJuby4KRGVsIG1pc21vIG1vZG8sIHNlIHJlYWxpemFyw6FuIGVuY3Vlc3RhcyBhIGxvcyBhbHVtbm9zIGRlIFVURUMgeSBzdXMgZmFtaWxpYXJlcwphIHRyYXbDqXMgZGUgcHJlZ3VudGFzIHJlbGFjaW9uYWRhcyBjb24gc3UgbW92aWxpemFjacOzbiBzb2NpYWwgYW50ZXMgeSBkdXJhbnRlIGxhCmN1YXJlbnRlbmEuCkVsbG8gY29uIGVsIHByb3DDs3NpdG8gZGUgZW5jb250cmFyIGxhcyByYXpvbmVzIGRlIG1vdmlsaXphY2nDs24KCiMjIE11ZXN0cmVvClRpcG8gZGUgbXVlc3RyZW8KCkVsIHRpcG8gZGUgbXVlc3RyZW8gZXMgYWxlYXRvcmlvIHNpbXBsZSBlc3RyYXRpZmljYWRvIHBhcmEgY2l1ZGFkYW5vcyBjb24gZWRhZGVzCmVudHJlIDE4LTUwIGHDsW9zLgpFbGxvLCBkYWRvIHF1ZSB0b2RvcyBsb3MgaW5kaXZpZHVvcyBkZSBzdWJjb25qdW50byBkZSBsYSBwb2JsYWNpw7NuIG9iamV0aXZvCnRpZW5lbiBsYSBtaXNtYSBwcm9iYWJpbGlkYWQgZGUgc2VyIHNlbGVjY2lvbmFkb3MuCgojIyBUYW1hw7FvIGRlIGxhIG11ZXN0cmEKKiBQYXJhIGxhIGludmVzdGlnYWNpw7NuLCBzZSBidXNjYSBjdW1wbGlyIHBvciBsbyBtZW5vcyBjb246CjwwLjA1LCBlPDAuMDUKKlBhcmEgZW5jb250cmFyIHVuIG7Dum1lcm8gbcOtbmltbyBkZSBwZXJzb25hcyBhIGVudHJldmlzdGFyLCBtYW50ZW5pZW5kbyB1bmEgY29uZmlhbnphIGRlIDk1JSB5IG1hcmdlbiBkZSBlcnJvciBkZSA1JSwgc2UgdXRpbGl6w7MgbGEgc2lndWllbnRlIGbDs3JtdWxhOgoKJCRuID0gWl4ycCgxLXApL2VeMiQkCgpDb21vIG5vIGhheSB0b2RhdsOtYSBkYXRvcyBwYXJhIG9idGVuZXIgZWwgdmFsb3IgcmVhbCBkZSBwLCBzZSBhc3VtZSBwID0gMC41LiBDb24gZWxsbywgc2Ugb2J0aWVuZSB1biB0YW1hw7FvIGRlIG11ZXN0cmEgZGUgcG9yIGxvIG1lbm9zIDkxIHBlcnNvbmFzIHBhcmEgc2VyIHNpZ25pZmljYXRpdm8uCgojIFByb3ZlbmllbmNpYSBkZSBsb3MgZGF0b3MKRXhpc3RlbiB2YXJpYXMgZnVlbnRlcyBkZSBsYSBxdWUgZXMgcG9zaWJsZSBleHRyYWVyIGxhIGluZm9ybWFjacOzbiBuZWNlc2FyaWEKcGFyYSByZXNwb25kZXIgbGFzIHByZWd1bnRhcy4KCiogQ29tcGVuZGlvIGRlIG5vcm1hcyBlbWl0aWRhcyBwb3IgZWwgRXN0YWRvIFBlcnVhbm8gcGFyYSBhZnJvbnRhciBsYSBwcm9wYWdhY2nDs24KICBkZWwgQ292aWQtMTkuICgxIGRlIGZlYnJlcm8gZGUgMjAyMCBhbCA3IGRlIG1heW8gZGUgMjAyMCkKKiBOb3JtYXRpdmEgc29icmUgRXN0YWRvIGRlIEVtZXJnZW5jaWEgcG9yIENvcm9uYXZpcnVzLgoqIEFjY2lvbmVzIGFkb3B0YWRhcyBwb3IgZWwgZ29iaWVybm8gYW50ZSBDT1ZJRC0xOSAoMjAyMCkKKiBDT1ZJRC0xOSBDb21tdW5pdHkgTW9iaWxpdHkgUmVwb3J0ICgyMDIwKS4KCipOb3RhOiBUb2RhcyBzZSBlbmN1ZW50cmFuIGNpdGFkYXMgZW4gYmlibGlvZ3JhZsOtYS4qCgpMYSBpbmZvcm1hY2nDs24gY29udGVuaWRhIGVuIGVzdGFzIGRpcmVjY2lvbmVzIHNvbiBvcmlnaW5hbGVzLAphZGVtw6FzIGRlIGNvbmZpYWJsZXMsIGRhZG8gcXVlIHNlIHByZXNlbnRhIGNhZGEgbWVkaWRhIGNvbiBzdSByZXNwZWN0aXZvIGRlY3JldG8KbGVnaXNsYXRpdm8uCkFzaW1pc21vLCBsb3MgZGF0b3MgZXN0YWTDrXN0aWNvcyBjdWVudGFuIGNvbiBzdXN0ZW50byBkZSBmdWVudGVzIG9maWNpYWxlcy4KCiMgVXNvIGRlIGRhdG9zCgpDb24gcmVzcGVjdG8gYWwgdXNvIGRlIGxvcyBkYXRvcyBvYnRlbmlkb3MgZGUgZnVlbnRlcywgdGVuZW1vcyBjbGFybyBjw7NtbyB1dGlsaXphciBjYWRhIHVubyBkZSBlbGxvcy4KTGEgZnVlbnRlIGRlIGxhIHF1ZSBhZHF1aXJpbW9zIGxhIGluZm9ybWFjacOzbiByZXNwZWN0byBhIGxhcyBtZWRpZGFzIHRvbWFkYXMgbm9zIGVzIGRlCm11Y2hhIGF5dWRhLCB5YSBxdWUganVudG8gYSBlbGxhcyBlc3TDoW4gbGFzIGZlY2hhcyBlbiBsYXMgcXVlIHNlIGxsZXZhcm9uIGEgY2Fiby4KRXN0byBub3MgcGVybWl0ZSBhbmFsaXphciBsYSBwb2JsYWNpw7NuIGFudGVzIHkgZGVzcHXDqXMgZGUgcXVlIHNlIGltcGxlbWVudGFyw6FuCmVzdGFzIG1lZGlkYXMuCgpMYXMgZnVlbnRlcyBkZSBsYXMgcXVlIGFkcXVpcmltb3MgbGFzIGdyw6FmaWNhcyBkZSBpbm1vdmlsaXphY2nDs24gc29jaWFsIHRhbWJpw6luIG5vcwpzb24gZGUgZ3JhbiBheXVkYSBwb3JxdWUgbm9zIHBlcm1pdGVuIHJlbGFjaW9uYXIgbGFzIGZlY2hhcyBlbiBsYXMgcXVlIHNlIGxsZXZhcm9uCmEgY2FibyBsYXMgbWVkaWRhcyBndWJlcm5hbWVudGFsZXMgY29uIGVsIGZsdWpvIGRlIGdlbnRlIGVuIGxhcyBjYWxsZXMuCkVzdGEgcmVsYWNpw7NuIGVzIG11eSBpbXBvcnRhbnRlLCB5YSBxdWUgbm9zIHBlcm1pdGlyw6EgYW5hbGl6YXIgbGEgZWZlY3RpdmlkYWQgZGUKbG9zIGRlY3JldG9zIHkgbm9zIGF5dWRhcsOhIGEgbG9ncmFyIG51ZXN0cm9zIG9iamV0aXZvcy4KRWwgcHJvY2VzYW1pZW50byBkZSBsYSBkYXRhIG9idGVuaWRhIGVuIGxhcyBmdWVudGVzIGVzIG11eSBpbXBvcnRhbnRlLApkZWJpZG8gYSBxdWUgcG9yIHPDrSBzb2xhcyBub3MgbXVlc3RyYW4gaW5mb3JtYWNpw7NuIOKAnGNydWRh4oCdIHF1ZSB0b2RvIGVsIG11bmRvIHlhIGNvbm9jZS4KQWwgcHJvY2VzYXIgZXN0YSBkYXRhIHkgcmVsYWNpb25hcmxhIGNvbiBvdHJhL3MsIGxhIGludmVzdGlnYWNpw7NuIHNlIHZ1ZWx2ZSBtw6FzCmludGVyZXNhbnRlLCB5YSBxdWUgbGFzIHJlbGFjaW9uZXMgZW50cmUgZGlmZXJlbnRlcyBlc3RhZMOtc3RpY2FzIHNvbgpwb3NpYmxlbWVudGUgZGVzY29ub2NpZGFzIHkgbGUgYnJpbmRhbiBpbmZvcm1hY2nDs24gbXVjaG8gbcOhcyDDunRpbCBhbCBsZWN0b3IuCgojIFBsYW5pZmljYWNpw7NuCgo8aW1nIHNyYz0iZ2FudHQuc3ZnIj4KCiMgTWVkaWRhcyBlbGVnaWRhcwoKMS4gRGVjcmV0byBkZSBlc3RhZG8gZGUgZW1lcmdlbmNpYS4KICAgIC0gwr9DdcOhbCBmdWUgZWwgZWZlY3RvIHF1ZSB0dXZvIGVsIGRlY3JldG8gZGUgZXN0YWRvIGRlIGVtZXJnZW5jaWEgZW4KICAgIGxhIHBvYmxhY2nDs24gZW1vY2lvbmFsbWVudGU/IChFeHBsb3JhdG9yaWEpCgoyLiBEZWNyZXRvIGRlIFVyZ2VuY2lhIHF1ZSBkaWN0YSBtZWRpZGFzIGV4dHJhb3JkaW5hcmlhcyBjb24gbGEgZmluYWxpZGFkIGRlCmFkcXVpcmlyIGJpZW5lcyB5IHNlcnZpY2lvcyBuZWNlc2FyaW9zIHBhcmEgZWwgYWxvamFtaWVudG8gZW4gY3VhcmVudGVuYSB5CmFsaW1lbnRhY2nDs24gZGUgbGFzIHBlcnNvbmFzIHF1ZSBkZWJhbiBkZXNwbGF6YXJzZSBkZW50cm8gZGVsIHBhw61zIGEKY29uc2VjdWVuY2lhIGRlIGxhIGRlY2xhcmFjacOzbiBkZWwgRXN0YWRvIGRlIEVtZXJnZW5jaWEgTmFjaW9uYWwgcG9yIGVsIENPVklELTE5ICgzODApCiAgICAtIMK/TGEgY2FudGlkYWQgZGUgcGVyc29uYXMgcXVlIHNlIHZpZXJvbiBiZW5lZmljaWFkYXMgcG9yIGVzdGUgZGVjcmV0byBmdWUKICAgIHN1ZmljaWVudGUgcGFyYSBxdWUgc2UgcmVkdXpjYSBjb25zaWRlcmFibGVtZW50ZSBlbCB0csOhbnNpdG8gZGUgZ2VudGU/IChJbmZlcmVuY2lhbCkKCjMuIEFwcnVlYmFuIGVsIFBhZHLDs24gZGUgbG9zIGhvZ2FyZXMgZW4gY29uZGljacOzbiBkZSBwb2JyZXphIG8gcG9icmV6YSBleHRyZW1hCmJlbmVmaWNpYXJpb3MgZGVsIHN1YnNpZGlvIG1vbmV0YXJpbyBkZSBhY3VlcmRvIGFsIFNpc3RlbWEgZGUgRm9jYWxpemFjacOzbiBkZQpIb2dhcmVzIChTSVNGT0gpIHF1ZSBzZSBlbmN1ZW50cmVuIGVuIGxvcyDDoW1iaXRvcyBnZW9ncsOhZmljb3MgY29uIG1heW9yCnZ1bG5lcmFiaWxpZGFkIHNhbml0YXJpYSBlbiBlbCBtYXJjbyBkZWwgRC5VLiBOwrAgMDI3LTIwMjAgKDY4KQogICAgLSDCv0xhIHRhc2EgZGUgcGVyc29uYXMgcXVlIHJlY2liZW4gbGEgYm9uaWZpY2FjacOzbiBwb3IgZMOtYSBmdWUgYWxjYW56YWJsZSBhIGxhCiAgICBtYXlvcsOtYSBkZSBwZXJzb25hcyBkZWwgc2VjdG9yIHZ1bG5lcmFibGU/IChEZXNjcmlwdGl2YSkKCjQuIERpc3Bvc2ljacOzbiBwcmVzaWRlbmNpYWwgcXVlIHBlcm1pdGUgbGEgc2FsaWRhIGRlIGhvbWJyZXMgeSBtdWplcmVzIGVuIGTDrWFzCmNvbXBsZW1lbnRhcmlvcyAobHVuZXMtbWnDqXJjb2xlcy12aWVybmVzIC8gbWFydGVzLWp1ZXZlcy1zw6FiYWRvcykKICAgIC0gwr9RdcOpIGRpZmVyZW5jaWEgaHVibyBlbiBlbCB0csOhbnNpdG8gZGUgcGVyc29uYXMgZW50cmUgbG9zIGTDrWFzIHBhcmEgaG9tYnJlcyB5CiAgICBwYXJhIG11amVyZXM/IChEZXNjcmlwdGl2YSkKICAgIC0gwr9BIGTDs25kZSBzZSBkaXJpZ2UgbGEgbWF5b3IgcGFydGUgZGVsIGZsdWpvIGRlIHBlcnNvbmFzPyDCv1F1w6kgcmF6w7NuIGV4cGxpY2Fyw61hIGVzdG8/IChFeHBsb3JhdG9yaWEpCgojIyAgUHJlZ3VudGFzIHByb3B1ZXN0YXMgcGFyYSBlc3R1ZGlvIChwYXJhIGxvcyBlbmN1ZXN0YWRvcykKCnxOwrAgfCBQcmVndW50YSB8IFRpcG8gfAp8LS0tfC0tLS0tLS0tLS18LS0tLS0tfAp8MSAgfMK/UXXDqSBlZGFkIHRpZW5lbiBsb3MgbWllbWJyb3MgZGUgbGEgbXVlc3RyYT98IERlc2NyaXB0aXZhfAp8MiAgfMK/RGUgcXXDqSBnw6luZXJvIHNvbj98IERlc2NyaXB0aXZhfAp8MyAgfMK/Q3XDoW50byBlcyBzdSBpbmdyZXNvIHByb21lZGlvP3wgRGVzY3JpcHRpdmF8Cnw0ICB8wr9FbiBxdcOpIGRpc3RyaXRvIHZpdmVzP3wgRGVzY3JpcHRpdmF8Cnw1ICB8wr9DdcOhbCBmdWUgZWwgw7psdGltbyBuaXZlbCBlZHVjYXRpdm8gcXVlIGNvbXBsZXRhc3RlP3wgRGVzY3JpcHRpdmF8Cnw2ICB8wr9TdSB0aXBvIGRlIGVtcGxlbyBlcyBmb3JtYWwgbyBpbmZvcm1hbD98IERlc2NyaXB0aXZhfAp8NyAgfMK/UXXDqSB0YW4gZnJlY3VlbnRlbWVudGUgc2Fsw61hIGRlIGNhc2EgcHJldmlhbWVudGUgYWwgY29taWVuem8gZGUgbGEgY3VhcmVudGVuYT98IERlc2NyaXB0aXZhfAp8OCAgfMK/UXXDqSB0YW50byBjb25zaWRlcmFzIHF1ZSB0dSBkaXN0cml0byBzZSBoYSB2aXN0byBhZmVjdGFkbyBwb3IgbGEgZW5mZXJtZWRhZD98IERlc2NyaXB0aXZhfAp8OSAgfMK/UG9yIHF1w6kgcmF6b25lcyBzYWzDrWFzIGR1cmFudGUgbGEgY3VhcmVudGVuYT98IERlc2NyaXB0aXZhfAp8MTAgIHzCv0NvbnNpZGVyYXMgcXVlIGVzdGEgbWVkaWRhIOKAnGMvdSBkZSBsYXMgbWVkaWRhc+KAnSBmdWUgZWZlY3RpdmEgcGFyYSByZWR1Y2lyIGVsIG7Dum1lcm8gZGUgY29udGFnaW9zIGVuIHR1IGRpc3RyaXRvP3wgRGVzY3JpcHRpdmF8CnwxMXzCv1F1w6kgY29uZGljaW9uZXMgY3JlZXMgcXVlIGFjZWxlcmFuIGxhIHByb3BhZ2FjacOzbiBkZWwgQ292aWQgZW4gdHUgZGlzdHJpdG8/fCBEZXNjcmlwdGl2YXwKfDEyIHzCv1F1w6kgY29uZGljaW9uZXMgY3JlZXMgcXVlIHJldGFyZGFuIGxhIHByb3BhZ2FjacOzbiBkZWwgQ292aWQgZW4gdHUgZGlzdHJpdG8/fCBEZXNjcmlwdGl2YXwKfDEzIHzCv1F1w6kgbWVkaWRhcyBndWJlcm5hbWVudGFsZXMgc29uIGxhcyBxdWUgcmVjdWVyZGFzIHF1ZSBzZSBoYXlhbiB0b21hZG8/fCBEZXNjcmlwdGl2YXwKCgojIyAgUHJlZ3VudGFzIHByb3B1ZXN0YXMgcGFyYSBlc3R1ZGlvIChwYXJhIGxhIGRhdGEpCgoKfE7CsCB8IFByZWd1bnRhIHwgVGlwbyB8CnwtLS18LS0tLS0tLS0tLXwtLS0tLS18CnwxNCAgfMK/UXXDqSB0YW50byB2YXLDrWFuIGxhcyBjaWZyYXMgZGUgbnVldm9zIGluZmVjdGFkb3MgZHVyYW50ZSBsb3MgcGVyaW9kb3MgZGUgaW5zdGF1cmFjacOzbiBwcmV2aW9zLXBvc3RlcmlvcmVzIGEgbGEgbWVkaWRhP3wgRGVzY3JpcHRpdmF8CnwxNSAgfMK/Q3XDoWxlcyBlcmFuIGxhcyByYXpvbmVzIHBvciBsYXMgcXVlIGxhIHBvYmxhY2nDs24gc2Fsw61hIGR1cmFudGUgbGEgY3VhcmVudGVuYT98IERlc2NyaXB0aXZhfAp8MTYgIHzCv0N1w6FsZXMgaGFuIHNpZG8gbGFzIG1lZGlkYXMgcXVlIGhhbiB0ZW5pZG8gbWF5b3IgaW1wYWN0byBlbiBsYSBwb2JsYWNpw7NuP3wgRGVzY3JpcHRpdmF8CnwxNyAgfEV4aXN0ZSB1bmEgbWlzbWEgdGVuZGVuY2lhIGRlIHBvYmxhY2lvbmVzIGFmZWN0YWRhcyBwb3IgZWwgQ292aWQgMTkgZHVyYW50ZSBsYXMgbWVkaWRhcyBkZSBhaXNsYW1pZW50bz8gfCBFeHBsb3JhdG9yaWF8CnwxOCAgfMK/TGFzIG1lZGlkYXMgZW4gbG9zIGRpc3RyaXRvcyBtw6FzIGV4Y2x1c2l2b3MgcHJlc2VudGFuIHVuYSBtYXlvciBvIG1lbm9yIGVmZWN0aXZpZGFkP3wgRXhwbG9yYXRvcmlhfAp8MTkgIHzCv0xhIGVudHJlZ2EgZGUgbWF5b3JlcyBzdWJzaWRpb3MgbW9uZXRhcmlvcyByZXN1bHRhcsOtYSBlbiB1biBpbXBvcnRhbnRlIGJlbmVmaWNpbyBwYXJhIGxhIGRpc21pbnVjacOzbiBkZWwgbsO6bWVybyBkZSBzYWxpZGFzP3wgSW5mZXJlbmNpYWx8CnwyMCAgfMK/RXMgcG9zaWJsZSBwcmVkZWNpciBjdcOhbnRhcyBob3JhcyBlbiBwcm9tZWRpbyB1bmEgcGVyc29uYSBzYWzDrWEgZGUgY2FzYSBjb25vY2llbmRvIHN1IG5pdmVsIGRlIGluZ3Jlc29zIHkgZWwgZGlzdHJpdG8gZGUgcmVzaWRlbmNpYT98IFByZWRpY3RpdmF8CnwyMSAgfMK/RXMgcG9zaWJsZSBwcmVkZWNpciBzdSBuaXZlbCBkZSBpbmdyZXNvcyBjb25vY2llbmRvIMO6bmljYW1lbnRlIHN1IHRpcG8gZGUgZW1wbGVvP3wgUHJlZGljdGl2YXwKfDIyICB8wr9RdcOpIGZhY3RvcmVzIGRldGVybWluYW4gcXVlIGxhIHByb3BhZ2FjacOzbiBkZWwgQ292aWQgMTkgc2UgZGVzYWNlbGVyZT98IENhdXNhbHwKfDIzICB8wr9Dw7NtbyBjaWVydGFzIGNvbmRpY2lvbmVzIGRldGVybWluYW4gcXVlIGxhIHByb3BhZ2FjacOzbiBkZWwgQ09WSUQgc2UgYWNlbGVyZSAvIHJldGFyZGU/fCBNZWNhbsOtc3RpY2F8CgojIFZhcmlhYmxlcwoKfFZhcmlhYmxlfCBSZWxhY2nDs24gY29uIHByZWd1bnRhfCBUaXBvIGRlIHZhcmlhYmxlfAp8LS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS18CnxFZGFkfCAxfCBDdWFudGl0YXRpdmEgZGlzY3JldGF8CnxHw6luZXJvfCAyfCBDdWFsaXRhdGl2YSBub21pbmFsfAp8Q2xhc2Ugc29jaWFsfCAzLDE3LDE4LDIwLDIxfCBDdWFsaXRhdGl2YSBvcmRpbmFsfAp8Tml2ZWwgZWR1Y2F0aXZvIGFsY2FuemFkb3wgNSwxNywxOHwgQ3VhbGl0YXRpdmEgb3JkaW5hbHwKfFRpcG8gZGUgdHJhYmFqb3wgNiwxOCwyMXwgQ3VhbGl0YXRpdmEgbm9taW5hbHwKfEZyZWN1ZW5jaWEgZGUgc2FsaWRhIHwgNywxOCwxOXwgQ3VhbnRpdGF0aXZhIGRpc2NyZXRhfAp8THVnYXIgZG9uZGUgdml2ZSAoZGlzdHJpdG8pfCA0LDE3LDE4LDIwfCBDdWFsaXRhdGl2YSBub21pbmFsfAp8Q2FudGlkYWQgZGUgaW5mZWN0YWRvcyBwb3IgZGlhfCAxNCwxOXwgQ3VhbnRpdGF0aXZhIGRpc2NyZXRhfAp8VGllbXBvIGFudGVzIHkgZGVzcHVlcyBkZSBsYXMgbWVkaWRhc3wxNCwxNywxOHwgQ3VhbnRpdGF0aXZhIGNvbnRpbnVhfAp8SnVzdGlmaWNhY2lvbiBkZSBzYWxpZGF8IDksMTV8IEN1YWxpdGF0aXZhIG5vbWlsYWx8CnxNZWRpZGFzIGFwbGljYWRhc3wgMTAsMTYsMTcsMTgsMTl8IEN1YWxpdGF0aXZhIG5vbWluYWx8CnxGYWN0b3Jlc3wgMjIsMjN8IEN1YWxpdGF0aXZhIG5vbWluYWx8CgojIERlc2NyaXB0b3JlcyBudW3DqXJpY29zIHBhcmEgbGFzIHZhcmlhYmxlcyBkZSBtYXlvciBpbXBvcnRhbmNpYToKCiMjIFZhcmlhYmxlcyBEYXRhIHdlYgoKKiBDYW50aWRhZCAgZGUgIHBlcnNvbmFzIHF1ZSBzZSBtb3ZpbGl6YW4gZW4gbGFzIGNhbGxlcyBhbnRlcyB5IGRlc3B1w6lzIGRlIGNhZGEgdW5hIGRlIGxhcyBtZWRpZGFzLCBUaWVtcG8sIE1lZGlkYXMgYXBsaWNhZGFzOgoKLSBNZWRpYSAodmFsb3IpOiBwZXJtaXRpcsOhICBjb25vY2VyIGVuIHByb21lZGlvIGN1w6FudG9zICBjaXVkYWRhbm9zIGxpbWXDsW9zIHNlIG1vdmlsaXphbiAgYW50ZXMgeSBkZXNwdcOpcyBkZSBsYSBtZWRpZGEKCi0gTWVkaWFuYSwgY3VhcnRpbGVzICh2YWxvcik6IHBlcm1pdGlyw6Egc2FiZXIgY3XDoW50b3MgY2l1ZGFkYW5vcyBsaW1lw7FvcyBzZSBtb3ZpbGl6YW4gYWwgMjUlLCA1MCU7IDc1JSwgMTAwJSAgZGVsIHRpZW1wbyBkZSBlc3R1ZGlvLCBkZSBlc3RhIG1hbmVyYSBzZSBjb25vY2Vyw6EgIGVsIGVmZWN0byBkZSBsYSBtb3ZpbGl6YWNpw7NuIGNvbiBlbCB0cmFuc2N1cnNvIGRlbCB0aWVtcG8gcGFyYSBjYWRhIG1lZGlkYS4KCi0gRGVzdmlhY2nDs24gZXN0w6FuZGFyOiBwZXJtaXRpcsOhIHNhYmVyIGN1w6FudGFzIHNvbiBsYXMgdmFyaWFjaW9uZXMgcHJvbWVkaW8gIGRlIG1vdmlsaXphY2nDs24gc29jaWFsIHJlc3BlY3RvIGEgbGEgbWVkaWEKCiMjIENhbnRpZGFkIGRlIGluZmVjdGFkb3MgcG9yIGTDrWEsIHRpZW1wbzoKCiogTWVkaWEodmFsb3IpOiBwZXJtaXRpcsOhIGNvbm9jZXIgY3XDoW50byBlcyBsYSB0YXNhIGluZmVjdGFkb3MgcXVlICBodWJvIGVuIHByb21lZGlvIGFudGVzIHkgZGVzcHXDqXMgZGUgbWVkaWRhIGFwbGljYWRhCgoqIE1lZGlhbmEsIGN1YXJ0aWxlcyAodmFsb3IpOiBwZXJtaXRpcsOhIHNhYmVyIGN1w6FudG9zIGluZmVjdGFkb3MgaHVibyBhbCAyNSUsIDUwJTs3NSUsIDEwMCUgIGRlbCB0aWVtcG8gZGUgZXN0dWRpbywgZGUgZXN0YSBtYW5lcmEgc2UgY29ub2NlcsOhICBlbCBlZmVjdG8gZGVsIG7Dum1lcm8gZGUgaW5mZWN0YWRvcyBjb24gZWwgdHJhbnNjdXJzbyBkZWwgdGllbXBvIHBhcmEgY2FkYSBtZWRpZGEuCgoqIERlc3ZpYWNpw7NuIGVzdMOhbmRhcjogcGVybWl0aXLDoSBzYWJlciBjdcOhbnRhcyBzb24gbGFzIHZhcmlhY2lvbmVzIHByb21lZGlvIGRlIGluZmVjdGFkb3MgcmVzcGVjdG8gYSBsYSBtZWRpYS4KCiMgVmFyaWFibGVzIEVuY3Vlc3RhcwoKIyMgRnJlY3VlbmNpYSBkZSBzYWxpZGEgcHJvbWVkaW8gYSBsYSBzZW1hbmEKCiogTWVkaWFuYSwgY3VhcnRpbGVzICh2YWxvcik6IHBlcm1pdGlyw6Egc2FiZXIgY3XDoW50YXMgc2FsaWRhcyBhIGxhIHNlbWFuYSByZXByZXNlbnRhIDI1JSw1MCUsNzUlIGRlIGxvcyBjaXVkYWRhbm9zIGRlIExpbWEgZW5jdWVzdGFkb3MgcGFyYSBjYWRhIG1lZGlkYSB5IHZhcmlhYmxlIGRlIGludGVyw6lzCgoqIE1vZGEgKHZhbG9yKTogcGVybWl0aXLDoSBzYWJlciBsYSBmcmVjdWVuY2lhIGRlIHNhbGlkYSBtYXlvcml0YXJpYSBkZSBsb3MgY2l1ZGFkYW5vcyBkZSBMaW1hIGVuY3Vlc3RhZG9zCgojIyBUaXBvIGRlIHRyYWJham8KCiogRnJlY3VlbmNpYSBkZSBvYnNlcnZhY2lvbmVzIHBhcmEgY2FkYSB0aXBvIGRlIHRyYWJham8gZW4gcmVsYWNpw7NuIGEgc3UgZnJlY3VlbmNpYSBkZSBzYWxpZGEKCiMjIEVkYWQKCiogTWVkaWFuYSwgY3VhcnRpbGVzICh2YWxvcik6IHBlcm1pdGlyw6Egc2FiZXIgY3XDoW50YXMgc2FsaWRhcyBhIGxhIHNlbWFuYSByZXByZXNlbnRhIDI1JSw1MCUsNzUlIGRlIGxvcyBjaXVkYWRhbm9zIGRlIExpbWEgZW5jdWVzdGFkb3MgcGFyYSBjYWRhIGZyZWN1ZW5jaWEgZGUgc2FsaWRhLCB5IGNhZGEgbWVkaWRhCgojIyBEaXN0cml0bwoKKiBNb2RhKHZhbG9yKTogcGVybWl0aXLDoSBjb25vY2VyIGVuIHF1w6kgZGlzdHJpdG8gaW5jaWRlbiBtw6FzIGVuIGxhcyB2ZWNlcyBkZSBzYWxpZGEgZGUgbGFzIHBlcnNvbmFzCgojIyBJbmdyZXNvcyBtZW5zdWFsZXMKCiogTW9kYSh2YWxvcik6IHBlcm1pdGlyw6EgY29ub2NlciBlbCBuaXZlbCBkZSBpbmdyZXNvcyBwb3IgY2FkYSBkaXN0cml0by4KCgojIyBHw6luZXJvCipGcmVjdWVuY2lhIGRlIG9ic2VydmFjaW9uZXMgcGFyYSBjYWRhIGfDqW5lcm8gZW4gcmVsYWNpw7NuIGEgc3UgZnJlY3VlbmNpYSBkZSBzYWxpZGEKCiMgRGVzY3JpcHRvcmVzIGdyw6FmaWNvcwoKIyMjIFV0aWxpemFyZW1vczoKCkdyw6FmaWNhIGRlIGRpc3BlcnNpw7NuIHBhcmEgbm90YXIgZsOhY2lsbWVudGUgY29tbyBhdW1lbnRhIG8gZGVjcmVjZSBsYSBjYW50aWRhZCBkZSBpbmZlY3RhZG9zIGUgaW5mZWN0YWRvcyBwb3IgZGlhIGFudGVzIHkgZGVzcHXDqXMgZGUgcXVlIHNlIGFwbGlxdWUgbGEgbWVkaWRhLiBBZGVtw6FzLCBsYSBncsOhZmljYSBkZSBkaXNwZXJzacOzbiBub3MgcHVlZGUgYXl1ZGFyIGEgZW5jb250cmFyIHVuYSByZWxhY2nDs24geS9vIHBhdHLDs24gZW50cmUgbGEgY2FudGlkYWQgZGUgaW5mZWN0YWRvcyB5L28gbW92aWxpemFjacOzbiBzb2NpYWwgeSBsb3MgZMOtYXMgdHJhbnNjdXJyaWRvcyBkZXNkZSBxdWUgc2UgZW1wbGXDsyBjYWRhIG1lZGlkYS4KClRhbWJpw6luIHV0aWxpemFyZW1vcyB1biBncsOhZmljbyBkZSBjYWphIGRlIGJpZ290ZXMgcGFyYSBkaWZlcmVuY2lhciBsYXMgZWRhZGVzIGRlIGxvcyBlbnRyZXZpc3RhZG9zIGRlIG1hbmVyYSByw6FwaWRhIHkgZWZlY3RpdmEuIEVzdG8gbm9zIHBlcm1pdGlyw6EgdmVyIGxhIHJlbGFjacOzbiBlbnRyZSBsYXMgZWRhZGVzIHkgcmVzcHVlc3RhcyBkYWRhcyBwb3IgbGFzIHBlcnNvbmFzLgoKQWRlbcOhcywgc2UgdXRpbGl6YXLDoW4gZ3LDoWZpY29zIGRlIGJhcnJhcyBwcmluY2lwYWxtZW50ZSBwYXJhIHZpc3VhbGl6YXIgeSBhbmFsaXphciBsYXMgcmVzcHVlc3RhcyBjdWFsaXRhdGl2YXMuIENvbiBsb3MgZ3LDoWZpY29zIGRlIGJhcnJhcyBzZSBwb2Ryw6FuIHZlciBjdWFsZXMgaGFuIHNpZG8gbGFzIHJlc3B1ZXN0YXMgY3VhbGl0YXRpdmFzIHJlc3BvbmRpZGFzIGNvbiBtw6FzIHkgbWVub3MgZnJlY3VlbmNpYS4KCkZpbmFsbWVudGUsIHNlIHVzYXLDoW4gaGlzdG9ncmFtYSBwYXJhIGRlc2NyaWJpciBsYXMgdmFyaWFibGVzIGN1YW50aXRhdGl2YXMgcXVlIHB1ZWRlbiBzZXIgZGlzdHJpYnVpZGFzIGVuIHJhbmdvcy4gRXN0byBub3MgZmFjaWxpdGFyw6EgYW5hbGl6YXIgbG9zIGRhdG9zIGNvbiBtdWNob3MgdmFsb3JlcyBvIHJlc3B1ZXN0YXMgcG9zaWJsZXMuCgojIyBQbG90cyB5IG90cmFzIGNvc2FzCmBgYHtyfQojIGN1cmwgLUxzICIkdXJsIiA+IGRmX2Zvcm0uY3N2Cgp0bXAgPC0gdGVtcGZpbGUoKQpjdXJsX2Rvd25sb2FkKCJodHRwczovL2RvY3MuZ29vZ2xlLmNvbS9zcHJlYWRzaGVldHMvZC9lLzJQQUNYLTF2UzVGd3NLSGw0UGh1a0lIZlNHYmZBOE5DUTVTcUJEcFExNktDNjlKQ2lGQVdWZUo0MEJBQ3AwZHFoQlRrSGk5Y3BMRV9KbUVtSXZmZHZBL3B1Yj9naWQ9NjM3MTAwODQzJnNpbmdsZT10cnVlJm91dHB1dD1jc3YiLCB0bXApCnJlYWRfY3N2KHRtcCkgLT4gZGZfZm9ybTEKCiMgU2VndW5kYSBlbmN1ZXN0YQp0bXAgPC0gdGVtcGZpbGUoKQpjdXJsX2Rvd25sb2FkKCJodHRwczovL2RvY3MuZ29vZ2xlLmNvbS9zcHJlYWRzaGVldHMvZC9lLzJQQUNYLTF2UzVGd3NLSGw0UGh1a0lIZlNHYmZBOE5DUTVTcUJEcFExNktDNjlKQ2lGQVdWZUo0MEJBQ3AwZHFoQlRrSGk5Y3BMRV9KbUVtSXZmZHZBL3B1Yj9naWQ9NjM3MTAwODQzJnNpbmdsZT10cnVlJm91dHB1dD1jc3YiLCB0bXApCgpyZWFkX2Nzdih0bXApICU+JQogICAgcmVuYW1lKAogICAgICAgIHRpZW1wbyA9ICJNYXJjYSB0ZW1wb3JhbCIsCiAgICAgICAgZWRhZCA9ICLCv0N1w6FsIGVzIHR1IGVkYWQ/IiwKICAgICAgICBnZW5lcm8gPSAiwr9EZSBxdcOpIGfDqW5lcm8gZXJlcz8iLAogICAgICAgIGluZ3Jlc28gPSAiwr9DdcOhbnRvIGVzIGVsIGluZ3Jlc28gbWVuc3VhbCBwcm9tZWRpbyBkZSB0dSBmYW1pbGlhIGFwcm94aW1hZGFtZW50ZSAoc29sZXMpID8iLAogICAgICAgIGRpc3RyaXRvID0gIsK/RW4gcXXDqSBkaXN0cml0byB2aXZlcz8iLAogICAgICAgIGVzdHVkaW8gPSAiwr9DdcOhbCBmdWUgZWwgw7psdGltbyBuaXZlbCBlZHVjYXRpdm8gcXVlIGNvbXBsZXRhc3RlPyIsCiAgICAgICAgZW1wbGVvID0gIsK/Q3XDoWwgZXMgdHUgdGlwbyBkZSBlbXBsZW8/IiwKICAgICAgICBzYWxpZGFzID0gIsK/Q3XDoW50YXMgdmVjZXMgYSBsYSBzZW1hbmEsIGVuIHByb21lZGlvLCBzYWzDrWFzIGRlIGNhc2EgZHVyYW50ZSBsb3MgZMOtYXMgZGUgY3VhcmVudGVuYT8iLAogICAgICAgIHJhem9uZXMgPSAiwr9Qb3IgcXXDqSByYXpvbmVzIHNhbMOtYXMgZHVyYW50ZSBsYSBjdWFyZW50ZW5hPyIsCiAgICAgICAgc29jaWFsLmJvb2wgPSAiwr9MYSBtZWRpZGEgZGUgXCJJbm1vdmlsaXphY2nDs24gc29jaWFsXCIsIHJlYWxtZW50ZSBoaXpvIHF1ZSB0dXMgc2FsaWRhcyBkdXJhbnRlIHRvZGEgbGEgY3VhcmVudGVuYSBmdWVyYW4gbXV5IHBvY2FzPyIsCiAgICAgICAgc29jaWFsLjA1ID0gIlJlc3BlY3RvIGEgbGEgYW50ZXJpb3IgcHJlZ3VudGEuIERlbCAwIGFsIDUsIMK/IEVuIGN1w6FudG8gZGlzbWludXnDsyB0dXMgc2FsaWRhcyBkdXJhbnRlIGxhIGN1YXJlbnRlbmE/IiwKICAgICAgICBvY2lvLmJvb2wgPSAiwr8gTGEgXCJTdXNwZW5zacOzbiBkZSBhY2Nlc28gYSBsdWdhcmVzIHDDumJsaWNvczogbHVnYXJlcyBkZSBvY2lvLCByZXN0YXVyYW50ZXMsIGV0Y1wiLCB0ZSBkZXNhbmltw7Mgc2FsaXIgZGUgY2FzYT8iLAogICAgICAgIG9jaW8uMDUgPSAiUmVzcGVjdG8gYSBsYSBhbnRlcmlvciBwcmVndW50YS4gRGVsIDAgYWwgNSwgwr9DdcOhbnRvIHRlIGRlc2FuaW3DsyBzYWxpciBkZSBjYXNhPyIsCiAgICAgICAgbm9kYXkuYm9vbCA9ICLCv0xhIG1lZGlkYSBcIkRpc3Bvc2ljacOzbiBzYWxpZGEgZGUgaG9tYnJlcyB5IG11amVyZXMgZW4gZMOtYXMgY29tcGxlbWVudGFyaW9zIChsdW5lcy1tacOpcmNvbGVzLXZpZXJuZXMgLyBtYXJ0ZXMtanVldmVzLXPDoWJhZG9zKVwiLCBnYXJhbnRpem8gcXVlIHNhbGllcmFzIG1lbm9zIHF1ZSBhbnRlcz8iLAogICAgICAgIG5vZGF5LjA1ID0gIlJlc3BlY3RvIGEgbGEgYW50ZXJpb3IgcHJlZ3VudGEuIERlbCAwIGFsIDUsIMK/Q3XDoW50byBjYW1iaW8gdHVzIHNhbGlkYXM/IiwKICAgICAgICBtdWx0YS5ib29sID0gIsK/IExhIG1lZGlkYSBcIk11bHRhIGRlIFMvLjg2IC1TLy4zNDAgcGFyYSB0b2RhcyBsYXMgcGVyc29uYXMgcXVlIGRlc29iZWRlY2VuIGRpc3Bvc2ljaW9uZXMgZGVsIGdvYmllcm5vXCIsIGhpem8gcXVlIHR1cyBzYWxpZGFzIGRlIGNhc2EgZnVlcmFuIG1lbm9yZXM/IiwKICAgICAgICBtdWx0YS4wNSA9ICJSZXNwZWN0byBhIGxhIGFudGVyaW9yIHByZWd1bnRhLiBEZWwgMCBhbCA1LCDCv0N1w6FuIG1lbm9yZXMgZnVlcm9uIHR1cyBzYWxpZGFzPyIsCiAgICAgICAgYm9uby5ib29sID0gIsK/IExhIG1lZGlkYSBcIkVudHJlZ2EgZGUgYm9ubyBTLy4gMzgwLCBTLy43NjAgZGUgYWN1ZXJkbyBhbCBTaXN0ZW1hIGRlIEZvY2FsaXphY2nDs24gZGUgSG9nYXJlcyAoU0lTRk9IKSBcIiwgcGVybWl0acOzIHF1ZSByZWR1amVyYXMgdHVzIHNhbGlkYXMgZGUgY2FzYT8iLAogICAgICAgIGJvbm8uMDUgPSAiUmVzcGVjdG8gYSBsYSBhbnRlcmlvciBwcmVndW50YS4gRGVsIDAgYWwgNSwgwr9DdcOhbnRvIHNlIHJlZHVqbyB0dXMgc2FsaWRhcz8iLAogICAgICAgIGFmcDEuYm9vbCA9ICLCvyBMYSBtZWRpZGEgXCJSZXRpcm8gZGUgaGFzdGEgUy8uIDIwMDAgZGUgZm9uZG9zIEFGUCBkZSB0cmFiYWphZG9yZXMgYWZpbGlhZG9zIHF1ZSBubyB0aWVuZW4gcGxhbmlsbGFcIiwgdGUgbWFudHV2byBtw6FzIHRpZW1wbyBlbiBjYXNhPyIsCiAgICAgICAgYWZwMS4wNSA9ICJSZXNwZWN0byBhIGxhIGFudGVyaW9yIHByZWd1bnRhLiBEZWwgMCBhbCA1LCDCvyBDdcOhbiBtw6FzIHRlIG1hbnR1dmlzdGUgZW4gY2FzYT8iLAogICAgICAgIGFmcDIuYm9vbCA9ICLCvyBMYSBtZWRpZGEgXCJSZXRpcm8gZGVsIDI1JSBkZSBmb25kb3MgQUZQIHBhcmEgdHJhYmFqYWRvcmVzIGFmaWxpYWRvc1wiLCB0ZSBtYW50dXZvIG3DoXMgdGllbXBvIGVuIGNhc2E/IiwKICAgICAgICBhZnAyLjA1ID0gIlJlc3BlY3RvIGEgbGEgYW50ZXJpb3IgcHJlZ3VudGEuIERlbCAwIGFsIDUsIMK/Q3XDoW50byB0aWVtcG8gbcOhcyB0ZSBtYW50dXZvIGVuIGNhc2E/IiwKICAgICAgICBkZWNjZWxlcmF0aW9uID0gIsK/UXXDqSBjb25kaWNpb25lcyBjcmVlcyBxdWUgZXhpc3RlbiBlbiB0dSBkaXN0cml0byBxdWUgcmV0YXJkYW4gbGEgcHJvcGFnYWNpw7NuIGRlbCBDb3ZpZD8iLAogICAgICAgIGFjY2VsZXJhdGlvbiA9ICLCv1F1w6kgY29uZGljaW9uZXMgY3JlZXMgcXVlIGV4aXN0ZW4gZW4gdHUgZGlzdHJpdG8gcXVlIGFjZWxlcmFuIGxhIHByb3BhZ2FjacOzbiBkZWwgQ292aWQ/IgogICAgKSAlPiUKICAgIG11dGF0ZSgKICAgICAgICBnZW5lcm8gPSBhcy5mYWN0b3IoZ2VuZXJvKSwKICAgICAgICBpbmdyZXNvID0gYXMuZmFjdG9yKGluZ3Jlc28pLAogICAgICAgIGRpc3RyaXRvID0gYXMuZmFjdG9yKGRpc3RyaXRvKSwKICAgICAgICBlc3R1ZGlvID0gZmFjdG9yKGVzdHVkaW8sIGxldmVscyA9IGMoIlNlY3VuZGFyaWEiLCAiVMOpY25pY2EiLCAiVW5pdmVyc2l0YXJpYSIsICJQb3NncmFkbyIpKSwKICAgICAgICBlbXBsZW8gPSBmYWN0b3IoZW1wbGVvLCBsZXZlbHMgPSBjKCJObyB0cmFiYWpvIiwgIkluZm9ybWFsIiwgIkZvcm1hbCIpKSwKICAgICAgICAjIEVzdGViYW4gTmljb2xhcyBWaWxsYWNvcnRhIEdhcmNpYSBjYW1iacOzIGxhcyByZXNwdWVzdGFzIGRlIGxhIGVuY3Vlc3RhCiAgICAgICAgIyBkZSAiTWF5b3IgNSIgYSA2LgogICAgICAgIHNhbGlkYXNfID0gc2FsaWRhcywKICAgICAgICBzYWxpZGFzID0gcmVwbGFjZShzYWxpZGFzLCBzYWxpZGFzPT0iNiIsICJNYXlvciA1IiksCiAgICAgICAgc2FsaWRhcyA9IGZhY3RvcihzYWxpZGFzLCBsZXZlbHMgPSBjKDA6NSwgIk1heW9yIDUiKSksCiAgICAgICAgcmF6b25lcyA9IHN0cnNwbGl0KHJhem9uZXMsICIsICIpLAogICAgICAgIHNvY2lhbC5ib29sID0gc29jaWFsLmJvb2wgPT0gIlPDrSIgfCBzb2NpYWwuYm9vbCA9PSAiU2kiLAogICAgICAgIG9jaW8uYm9vbCA9IG9jaW8uYm9vbCA9PSAiU8OtIiB8IG9jaW8uYm9vbCA9PSAiU2kiLAogICAgICAgIG5vZGF5LmJvb2wgPSBub2RheS5ib29sID09ICJTw60iIHwgbm9kYXkuYm9vbCA9PSAiU2kiLAogICAgICAgIG11bHRhLmJvb2wgPSBtdWx0YS5ib29sID09ICJTw60iIHwgbXVsdGEuYm9vbCA9PSAiU2kiLAogICAgICAgIGJvbm8uYm9vbCA9IGJvbm8uYm9vbCA9PSAiU8OtIiB8IGJvbm8uYm9vbCA9PSAiU2kiLAogICAgICAgIGFmcDEuYm9vbCA9IGFmcDEuYm9vbCA9PSAiU8OtIiB8IGFmcDEuYm9vbCA9PSAiU2kiLAogICAgICAgIGFmcDIuYm9vbCA9IGFmcDIuYm9vbCA9PSAiU8OtIiB8IGFmcDIuYm9vbCA9PSAiU2kiLAogICAgICAgIGFjY2VsZXJhdGlvbiA9IHN0cnNwbGl0KGFjY2VsZXJhdGlvbiwgIiwgIiksCiAgICAgICAgZGVjY2VsZXJhdGlvbiA9IHN0cnNwbGl0KGRlY2NlbGVyYXRpb24sICIsICIpCiAgICApIC0+IGRmX2Zvcm0yCmRmX2Zvcm0yCmBgYAoKIyMjIEVkYWQgZGUgbGEgbXVlc3RyYQpgYGB7cn0Kc3VtbWFyeShkZl9mb3JtMiRlZGFkKQpib3hwbG90KGRmX2Zvcm0yJGVkYWQsIHhsYWIgPSAiIiwgeWxhYiA9ICJFZGFkIiwgbWFpbj1OVUxMKQp0aXRsZSgiR3LDoWZpY28gMS4gRWRhZCIpCmBgYAoKJCRuID0gMzEwLCBzZCA9IDEyLjYxOSQkCgojIyMgR8OpbmVybwpgYGB7cn0KZGZfZm9ybTIgJT4lCiAgICBncm91cF9ieShnZW5lcm8pICU+JQogICAgc3VtbWFyaXNlKG4gPSBuKCkpICU+JQogICAgYmFycGxvdChufmdlbmVybywgZGF0YT0uLCB4bGFiPSJQZXJzb25hcyIsIHlsYWI9IkNhbnRpZGFkIikKCnRpdGxlKCJHcsOhZmljbyAyLiBHw6luZXJvIikKYGBgCgojIyMgSW5ncmVzbyBwcm9tZWRpbwoKYGBge3J9CnBhcihtYWkgPSBjKDAuOCwgMS41LCAwLjIsIDAuNSkpCmRmX2Zvcm0yICU+JQogICAgZ3JvdXBfYnkoaW5ncmVzbykgJT4lCiAgICBzdW1tYXJpc2UobiA9IG4oKSkgJT4lCiAgICBiYXJwbG90KG5+aW5ncmVzbywgZGF0YT0uLCBob3JpeiA9IFRSVUUsIGxhcyA9IDIsIHhsYWIgPSAiUGVyc29uYXMiLCB5bGFiPSIiKQp0aXRsZSh5bGFiPSJJbmdyZXNvIiwgbGluZT02KQp0aXRsZSgiR3LDoWZpY28gMy4gSW5ncmVzb3MiKQpgYGAKCiMjIyBEaXN0cml0bwpgYGB7ciwgZmlnLndpZHRoPTEyLCBmaWcuaGVpZ2h0PTIwfQpwYXIobWFpID0gYygxLCAyLCAwLjUsIDAuNSkpCiNwbG90KGVkYWR+ZGlzdHJpdG8sIGRhdGEgPSBkZl9mb3JtMiwgaG9yaXpvbnRhbD1UUlVFLCBsYXM9MiwgeGxhYj0iIikKI3RpdGxlKHlsYWI9IkRpc3RyaXRvIiwgbGluZT04KQoKZGZfZm9ybTIkZGlzdHJpdG8gJT4lCiAgICB0YWJsZSgpICU+JQogICAgc29ydChUUlVFKSAlPiUKICAgIGJhcnBsb3QoaG9yaXogPSBUUlVFLCBsYXMgPSAyLCB4bGFiID0gIlBlcnNvbmFzIiwgeWxhYj0iIikKdGl0bGUoIkdyw6FmaWNvIDQuIERpc3RyaXRvIikKYGBgCgojIyMgRW1wbGVvCmBgYHtyfQpwYXIobWFpID0gYygxLCAxLjUsIDAuNSwgMC41KSkKZGZfZm9ybTIkZW1wbGVvICU+JQogICAgdGFibGUoKSAlPiUKICAgIHNvcnQoVFJVRSkgJT4lCiAgICBiYXJwbG90KGhvcml6ID0gVFJVRSwgbGFzID0gMiwgeGxhYiA9ICJQZXJzb25hcyIsIHlsYWI9IiIpCgp0aXRsZSgiR3LDoWZpY28gNS4gVGlwbyBkZSB0cmFiYWpvIikKYGBgCgojIyMgwr9RdcOpIHRhbnRvIHZhcsOtYW4gbGFzIGNpZnJhcyBkZSBudWV2b3MgaW5mZWN0YWRvcyBkdXJhbnRlIGxvcyBwZXJpb2RvcyBkZSBpbnN0YXVyYWNpw7NuIHByZXZpb3MtcG9zdGVyaW9yZXMgYSBsYSBtZWRpZGE/CgpQYXJhIGVzdGEgcHJpbWVyYSBwcmVndW50YSBzZSBoYW4gcHJvY2VzYWRvIGxvcyBkYXRvcyB3ZWIuIFNlIHByZXNlbnRhcsOhbiBkb3MgZ3LDoWZpY29zIHBvciBjYWRhIHVuYSBkZSBsYXMgY3VhdHJvIG1lZGlkYXMgcXVlIHNlIGFuYWxpemFyw6FuLiBFbCBwcmltZXJvIGRlIGVsbG9zIHNlcsOhIGRlIGxvcyBudWV2b3MgY2Fzb3MgeSBlbCBzZWd1bmRvIGRlIGxhIG1vdmlsaXphY2nDs24gcmVjcmVhY2lvbmFsIChjYW1iaW9zIGVuIGxhIG1vdmlsaXphY2nDs24pLiBMb3MgZGVzY3JpcHRvcmVzIHF1ZSBzZSBlc3TDoW4gdXRpbGl6YW5kbyBwYXJhIGRlc2NyaWJpciBtZWpvciBsb3MgZGF0b3Mgb2J0ZW5pZG9zIGVzIGxhIG1lZGlhIHkgbWVkaWFuYS4gRXMgbmVjZXNhcmlvIGRlc3RhY2FyIHF1ZSBzZSBoYSBvcHRhZG8gcG9yIGdyYWZpY2FyIGxvcyBkYXRvcyBkaWV6IGTDrWFzIGFudGVzIGRlIHF1ZSBzZSBkZWNyZXRlIGxhIG1lZGlkYSB5IGRpZXogZMOtYXMgZGVzcHXDqXMgZGUgaGFiZXJzZSBwcm9tdWxnYWRvLgoKCiMgRGVjbGFyYWNpw7NuIGRlbCBFc3RhZG8gZGUgRW1lcmdlbmNpYQoKRW4gZXN0YSBncsOhZmljYSBwb2RlbW9zIHZpc3VhbGl6YXIgcXVlIGxhIGNhbnRpZGFkIGRlIGluZmVjdGFkb3MgcG9yIGTDrWEgYmFqw7MgZW4gYWxndW5vcyBkw61hcyBpbm1lZGlhdGFtZW50ZSBkZXNwdcOpcyBkZSBxdWUgc2UgZGVjbGFyYXLDoSBlbCBlc3RhZG8gZGUgZW1lcmdlbmNpYS4gU2UgcHVlZGUgYXByZWNpYXIgZW4gbGEgZ3LDoWZpY2EgcXVlIHNlIGxsZXZhIGEgY2FibyBjYWRhIDIgbyAzIGTDrWFzIGR1cmFudGUgbGEgc2VtYW5hIHNpZ3VpZW50ZSBhIGxhIGltcGxlbWVudGFjacOzbiBkZWwgRXN0YWRvIGRlIEVtZXJnZW5jaWEuIEVzdG8gc2UgcG9kcsOtYSBkZWJlciBhIGZhY3RvcmVzIGNvbW8gbGEgY2FudGlkYWQgZGUgcHJ1ZWJhcyB0b21hZGFzIHBvciBkw61hLCBmcmVjdWVuY2lhIGRlIHNhbGlkYSBkZSBsYXMgcGVyc29uYXMgeSBlbCBjdW1wbGltaWVudG8gZGUgbGFzIGxleWVzIHkgbWVkaWRhcyB0b21hZGFzLgoKYGBge3IsZWNobz1GQUxTRSxtZXNzYWdlPUZBTFNFLHJlc3VsdHM9ImFzaXMifQpjYXRfcGxvdChsdWJyaWRhdGU6OnltZCgiMjAyMC0wMy0xNSIpLCAxMCwgIkdyw6FmaWNvIDYuIERlY2xhcmFjacOzbiBkZWwgZXN0YWRvIGRlIEVtZXJnZW5jaWEiLCBwbG90X25ld19jYXNlcywgIk51ZXZvcyBjYXNvcyIpCmBgYApQYXJhIGFuYWxpemFyIGVzdGEgZ3LDoWZpY2EsIHNlIGFzdW1lIHF1ZSBlbCBjcmVjaW1pZW50byBkZSBsYSBlbmZlcm1lZGFkIGJham8gY29uZGljaW9uZXMgbm9ybWFsZXMgZXMgZXhwb25lbmNpYWwuIFBvciB0YW50bywgc2UgcHVlZGUgY29uc3RydWlyIHVuIG1vZGVsbyB0YWwgcXVlOgpsbih5KSB+IEF0K0IuIFRvbWFuZG8gYSBMMSBjb21vIHJlZ3Jlc2nDs24gZGUgY29udHJvbCBzaW4gdmFyaWFibGUgaW5kZXBlbmRpZW50ZSB5IEwyIGxhIHJlZ3Jlc2nDs24gbHVlZ28gZGUgYXBsaWNhcnNlIGxhIG1lZGlkYSwgc2UgcmVhbGl6w7MgdW4gRi10ZXN0IHBhcmEgY29tcHJvYmFyIHNpIGVsIG1vZGVsbyBMMSBtb2RlbGEgYSBMMiBzaW4gZGlmZXJlbmNpYXMgc2lnbmlmaWNhdGl2YXMuCgoqIEhvIDogTm8gZXhpc3RlbiBkaWZlcmVuY2lhcyBzaWduaWZpY2F0aXZhcyBlbnRyZSBhbWJvcyBtb2RlbG9zLgoqIEhhIDogRXhpc3RlbiBkaWZlcmVuY2lhcyBzaWduaWZpY2F0aXZhcyBlbnRyZSBlbCBtb2RlbG8gYW50ZXJpb3IgYSBsYSBtZWRpZGEgeSBlbCBhY3R1YWwuCgp8RiAtIFRlc3QgVHdvIC0gU2FtcGxlIGZvciBWYXJpYW5jZXMgfAp8LS0tfC0tLS0tLS0tLS18LS0tLS0tfAp8IHwgVmFyaWFibGUgMXwgVmFyaWFibGUgMiB8CnwtLS18LS0tLS0tLS0tLXwtLS0tLS18CnxNZWFuICB8MS41NTk1MDM1NXwgMy42MDM1Nzc5NDZ8CnxWYXJpYW5jZSAgfDEuMzA3NTE0MjN8IDAuMjAxNjc4ODU0fAp8T2JzZXJ2YXRpb25zIHwxMHwgOXwKfGRmICB8OXwgOHwKfEYgIHw2LjQ4MzE0OTg0fCB8CnxQIChGIDw9IGYpIG9uZS10YWlsICB8MC4wMDc0NjYyOXwgfAp8RiBjcsOtdGljbyBvbmUtdGFpbCAgfDMuMzg4MTMwMjN8IHwKfC0tLXwtLS0tLS0tLS0tfC0tLS0tLXwKCkRhZG8gcXVlIGxhIHZhcmlhbnphIDEgPiB2YXJpYW56YSAyLCBsYSBlbGVjY2nDs24gZGVsIG9yZGVuIGRlIGxhcyB2YXJpYWJsZXMgZXMgY29ycmVjdGEuIFBvciB0YW50bywgZGFkbyBGID4gRiBjcsOtdGljbywgc2UgZW5jdWVudHJhIGV2aWRlbmNpYSBwYXJhIGZhbHNlYXIgSG8uIERhZG8gzrEgPiBQKEY8PWYpIHVuYSBjb2xhLCBzZSByZWNoYXphIGxhIGhpcMOzdGVzaXMgbnVsYSwgcG9yIGxvIHF1ZSBleGlzdGVuIGRpZmVyZW5jaWFzIHNpZ25pZmljYXRpdmFzLiBDb21wYXJhbmRvIGxhcyBwZW5kaWVudGVzIEExPTAuMzM3IHkgQTI9MC4wNzI5IGNvbiBBMiA8QTEsIHNlIHB1ZWRlIGFzdW1pciBxdWUgc2UgZnJlbsOzIGxhIGV4cGFuc2nDs24gZGUgbGEgZW5mZXJtZWRhZC4KCmBgYHtyLGVjaG89RkFMU0UsbWVzc2FnZT1GQUxTRSxyZXN1bHRzPSJhc2lzIn0KY2F0X3Bsb3QobHVicmlkYXRlOjp5bWQoIjIwMjAtMDMtMTUiKSwgMTAsICJHcsOhZmljbyA3LiBEZWNsYXJhY2nDs24gZGVsIGVzdGFkbyBkZSBFbWVyZ2VuY2lhIiwgcGxvdF9ybW92ZXMsICJNb3ZpbGl6YWNpw7NuIHJlY3JlYWNpb25hbCIpCmBgYApBIHBhcnRpciBkZWwgZ3LDoWZpY28gNywgc2UgbG9ncmEgdmlzdWFsaXphciBxdWUgcHJldmlvIGEgbGEgcHJvbXVsZ2FjacOzbiBkZSBsYSBtZWRpZGEg4oCcRGVjbGFyYWNpw7NuIGRlIEVzdGFkbyBkZSBFbWVyZ2VuY2lh4oCdLCBsYSBnZW50ZSB0ZW7DrWEgbXVjaGEgbcOhcyBtb3ZpbGl6YWNpw7NuIHkgbHVlZ28gZGUgZGVjcmV0YWRhLCBlbCBjYW1iaW8gZGUgbW92aWxpemFjacOzbiBkaXNtaW51ecOzIGVuIGdyYW4gbWVkaWRhLiBFbCBwcm9tZWRpbyB5IG1lZGlhbmEgKGzDrW5lYXMgY29udGludWFzKSBhbnRlcyBkZSBxdWUgc2UgYXBsaXF1ZSBlc3RhIG1lZGlkYSBlcyBhcHJveGltYWRhbWVudGUgLTMuIFBvciBvdHJvIGxhZG8sIGVsIHByb21lZGlvIHkgbWVkaWFuYSAobMOtbmVhcyBwdW50ZWFkYXMpIGRlc2RlIGVsIHF1aW5jZSBoYXN0YSBlbCB2ZWludGljaW5jbyBlc3TDoSBwb3IgZGViYWpvIGRlIC02MC4KClBhcmEgY29tcHJvYmFyIGxhIHNpZ25pZmljYW5jaWEgZGUgZXN0YSBkaWZlcmVuY2lhLCBzZSByZWFsaXrDsyB1biB0ZXN0LXQgZGUgbWVkaWFzLiBTZSBhc3VtaWVyb24gbGFzIHNpZ3VpZW50ZXMgaGlww7N0ZXNpczoKCiogSG8gOiBObyBleGlzdGUgdW4gZWZlY3RvIHNpZ25pZmljYXRpdm8gZGUgbGEgbWVkaWRhIHBvciBzb2JyZSBsYXMgbWVkaWFzIGRlbCBDYW1iaW8gZGUgTW92aWxpemFjacOzbi4KKiBIYSA6IEV4aXN0ZW4gZGlmZXJlbmNpYXMgc2lnbmlmaWNhdGl2YXMgZW50cmUgbGFzIG1lZGlhcyBkZSBsYSB2YXJpYWJsZSBDYW1iaW8gZGUgTW92aWxpemFjacOzbiBwYXJhIGFudGVzIHkgZGVzcHXDqXMgZGUgZWplY3V0YXJzZSBsYSBtZWRpZGEuCgp8dCAtIFRlc3QgVHdvIEFzc3VtaW5nIFVuZXF1YWwgVmFyaWFuY2VzIHwKfC0tLXwtLS0tLS0tLS0tfC0tLS0tLXwKfCB8IFZhcmlhYmxlIDF8IFZhcmlhYmxlIDIgfAp8LS0tfC0tLS0tLS0tLS18LS0tLS0tfAp8TWVhbiAgfC0zLjM2MzYzNjM2NHwgLTcxLjE4MTgxODJ8CnxWYXJpYW5jZSAgfDE1LjY1NDU0NTQ1fCAxMTMuMzYzNjM2fAp8T2JzZXJ2YXRpb25zIHwxMXwgMTF8CnxkZiAgfDEzfCB8Cnx0IFN0YXQgIHwxOS44MDIzNjM0fCB8CnxQIChUIDw9IHQpIG9uZS10YWlsICB8Mi4xNTI2MUUtMTF8IHwKfHQgY3LDrXRpY2FsIG9uZS10YWlsICB8MS43NzA5MzMzOTZ8IHwKfFAgKFQgPD0gdCkgdHdvLXRhaWwgIHw0LjMwNTIxRS0xMXwgfAp8dCBjcsOtdGljYWwgdHdvLXRhaWwgIHwyLjE2MDM2ODY1NnwgfAp8LS0tfC0tLS0tLS0tLS18LS0tLS0tfAoKRGFkbyBxdWUgZWwgdmFsb3IgfHR8ID4gdC1jcsOtdGljbyBkb3MgY29sYXMsIHNlIHB1ZWRlIGVuY29udHJhciBldmlkZW5jaWEgcGFyYSByZWNoYXphciBsYSBoaXDDs3Rlc2lzIG51bGEgSG8uIERhZG8gzrEgPTAuMDUgPiBQKFQ8PXQpIGRvcyBjb2xhcywgZXhpc3RlIHNpZ25pZmljYW5jaWEgc3VmaWNpZW50ZSBwYXJhIGVsbG8uIFBvciB0YW50bywgc2UgcmVjaGF6YSBIbywgZXhpc3RpZW5kbyBwb3IgdGFudG8gZGlmZXJlbmNpYXMgc2lnbmlmaWNhdGl2YXMgZW50cmUgYW50ZXMgZGUgZWplY3V0YXJzZSBsYSBkZWNsYXJhY2nDs24gZGUgRXN0YWRvIGRlIEVtZXJnZW5jaWEgeSBkZXNwdcOpcyBzb2JyZSBsYSBtb3ZpbGl6YWNpw7NuIGRlIGxhcyBwZXJzb25hcy4gRGViaWRvIGEgcXVlIGVsIGNvZWZpY2llbnRlIGRlIGNvcnJlbGFjacOzbiBlcyBtZW5vciBhIDAsIHNlIHB1ZWRlIGFmaXJtYXIgcXVlIGVsIGNhbWJpbyBhZGVtw6FzIHJlZHVqbyBsYSBtb3ZpbGl6YWNpw7NuLgoKIyMgQXByb2JhY2nDs24gZGVsIFBhZHLDs24gZGUgSG9nYXJlcwoKRXN0ZSBncsOhZmljbyBub3MgbXVlc3RyYSBsYSBjYW50aWRhZCBkZSBjYXNvcyBkaWV6IGTDrWFzIGFudGVzIHkgZGlleiBkw61hcyBkZXNwdcOpcyBkZSBxdWUgbGEgbWVkaWRhIOKAnEFwcm9iYWNpw7NuIGRlbCBQYWRyw7NuIGRlIEhvZ2FyZXPigJ0gZnVlcmEgYXByb2JhZGEuIEVzdGEgZXMgdW5hIGdyw6FmaWNhIG11eSBpbXBvcnRhbnRlLCBkYWRvIHF1ZSB0ZW7DrWEgY29tbyBvYmpldGl2byBheXVkYXIgYSBsYXMgcG9ibGFjaW9uZXMgbcOhcyB2dWxuZXJhYmxlcyBlbiBjb25kaWNpw7NuIGRlIGV4dHJlbWEgcG9icmV6YSBhIG5pdmVsIG5hY2lvbmFsIHBhcmEgcXVlIHB1ZGllcmFuIHN1YnNpc3RpciBkdXJhbnRlIGxhIGN1YXJlbnRlbmEuIERpY2hvIGVuIG90cmFzIHBhbGFicmFzLCBwYXJhIHF1ZSBwdWRpZXJhbiBhY2NlZGVyIGEgbG9zIHNlcnZpY2lvcyBiw6FzaWNvcyB5IG1lZGljYW1lbnRvcywgZW4gY2FzbyBmdWVzZW4gcmVxdWVyaWRvcy4gTGEgY2FudGlkYWQgZGUgY2Fzb3MgYW50ZXMgZGUgcXVlIGxhIG1lZGlkYSBmdWVzZSBkZWNsYXJhZGEsIDA4LzAzIGhhc3RhIDE4LzAzLCAgdmEgZGVzZGUgYXByb3hpbWFkYW1lbnRlIHVubyBoYXN0YSB2ZWludGUuIE5vIG9ic3RhbnRlLCBkZXNkZSAxOC8wMyBoYXN0YSAyOC8wMyBsYSBjYW50aWRhZCBkZSBjYXNvcyB2YSBlbiBhdW1lbnRvLiBTaW4gZHVkYSBhbGd1bmEsIGVsIG9iamV0aXZvIGVyYSBidWVubywgcGVybyBwYXJhIGVsIHBhbm9yYW1hIHF1ZSBzZSBlc3RhYmEgdml2aWVuZG8gbm8gZnVlIGVmZWN0aXZhLiBVbmEgcG9zaWJsZSBoaXDDs3Rlc2lzIHNlcsOtYSBsYSBzYWxpZGEgb2JsaWdhdG9yaWEgZGUgbG9zIGJlbmVmaWNpYXJpb3MgYSBsb3MgYmFuY29zIGEgZm9ybWFyIGxhcmdhcyBjb2xhcyBkdXJhbnRlIGhvcmFzLiBFc3RvIGV4cGxpY2Fyw61hIGVsIGF1bWVudG8gZGUgY2Fzb3MuCgpgYGB7cixlY2hvPUZBTFNFLG1lc3NhZ2U9RkFMU0UscmVzdWx0cz0iYXNpcyJ9CmNhdF9wbG90KGx1YnJpZGF0ZTo6eW1kKCIyMDIwLTAzLTE4IiksIDEwLCAiR3LDoWZpY28gOC4gQXByb2JhY2nDs24gZGVsIFBhZHLDs24gZGUgSG9nYXJlcyIsIHBsb3RfbmV3X2Nhc2VzLCAiTnVldm9zIGNhc29zIikKYGBgClNlIHJlYWxpesOzIHVuIGYtdGVzdCBzb2JyZSBsb3MgaW5wdXRzIGEgbGEgcmVncmVzacOzbiBsaW5lYWwgZGVsIGxvZ2FyaXRtbyBkZSBsYSBncsOhZmljYSwgc2lndWllbmRvIGVsIG1vZGVsbyBwbGFudGVhZG8gYXJyaWJhLiBTZSBjb2xvY8OzIGNvbW8gY29udHJvbCBhIHRvZG9zIGxvcyBkYXRvcyBwcmV2aW9zIGEgZGVjbGFyYXJzZSBsYSBtZWRpZGEuIFNlIHBsYW50ZWFyb24gbGFzIHNpZ3VpZW50ZXMgaGlww7N0ZXNpczoKCiogSG8gOiBObyBleGlzdGUgdW4gZWZlY3RvIHNpZ25pZmljYXRpdm8gZGUgbGEgbWVkaWRhIHBvciBzb2JyZSBsYSB0ZW5kZW5jaWEgZGUgbG9zIG51ZXZvcyBjYXNvcyBjb24gcmVzcGVjdG8gYWwgY29udHJvbC4KKiBIYSA6IEV4aXN0ZW4gdW4gZWZlY3RvIHNpZ25pZmljYXRpdm8gZW50cmUgbGFzIG11ZXN0cmFzIGRlIGNvbnRyb2wgeSBsYSBkYXRhIHBvc3RlcmlvciBhIGxhIGRlY2xhcmFjacOzbi4KCnxGIC0gVGVzdCBUd28gLSBTYW1wbGUgZm9yIFZhcmlhbmNlcyB8CnwtLS18LS0tLS0tLS0tLXwtLS0tLS18CnwgfCBWYXJpYWJsZSAxfCBWYXJpYWJsZSAyIHwKfC0tLXwtLS0tLS0tLS0tfC0tLS0tLXwKfE1lYW4gIHwxLjUzODg3OXwgMy4yMTgxMjJ8CnxWYXJpYW5jZSAgfDAuOTQ5MzI5fCAwLjE0ODkwN3wKfE9ic2VydmF0aW9ucyB8MTB8IDEwfAp8ZGYgIHw5fCA5fAp8RiAgfDYuMzc1MzIxfCB8CnxQIChGIDw9IGYpIG9uZS10YWlsICB8MC4wMDgzOTh8IHwKfEYgY3LDrXRpY28gb25lLXRhaWwgIHwzLjQzODEwMXwgfAp8LS0tfC0tLS0tLS0tLS18LS0tLS0tfAoKRGFkbyBxdWUgbGEgcHJpbWVyYSB2YXJpYW56YSBlcyBtYXlvciBhIGxhIHNlZ3VuZGEsIGVsIG9yZGVuIGRlIG9wZXJhY2nDs24gZGUgbG9zIGRhdG9zIGVzIGNvcnJlY3RvLiBDb21vIHRhbCwgZGFkbyBGID4gRi1jcml0aWNvIHVuYSBjb2xhLCBlbmNvbnRyYW1vcyBldmlkZW5jaWEgZW4gY29udHJhIGRlIEhvLiBEYWRvIGFkZW1hcyBQKEY8PWYpIDwgzrEgLCBzZSBwdWVkZSBnYXJhbnRpemFyIGxhIGRlY2lzacOzbiBkZSByZWNoYXphciBsYSBoaXDDs3Rlc2lzIG51bGEsIHBvciBsbyBxdWUgZGViZW4gZXhpc3RpciBkaWZlcmVuY2lhcyBzaWduaWZpY2F0aXZhcyBlbnRyZSBsb3MgZGF0b3MuIERhZG8gYWRlbcOhcyBBMT0gMC4yNjcyID4gQTI9MC4wMTE2LCBzZSBwdWVkZSBhZmlybWFyIHF1ZSBsYSBtZWRpZGEgcmVkdWpvIGxhIHRhc2EgZGUgaW5mZWNjacOzbi4KCmBgYHtyLGVjaG89RkFMU0UsbWVzc2FnZT1GQUxTRSxyZXN1bHRzPSJhc2lzIn0KY2F0X3Bsb3QobHVicmlkYXRlOjp5bWQoIjIwMjAtMDMtMTgiKSwgMTAsICJHcsOhZmljbyA5LiBBcHJvYmFjacOzbiBkZWwgUGFkcsOzbiBkZSBIb2dhcmVzIiwgcGxvdF9ybW92ZXMsICJNb3ZpbGl6YWNpw7NuIHJlY3JlYWNpb25hbCIpCmBgYApFc3RhIGdyw6FmaWNhLCBhbCBpZ3VhbCBxdWUgbGEgR3LDoWZpY2EgNywgbWFuaWZpZXN0YSB1biBjb21wb3J0YW1pZW50byBzaW1pbGFyLiBTaW4gZW1iYXJnbywgYSBwYXJ0aXIgZGUgbGEgZGlzbWludWNpw7NuIGRlIGxhIGN1cnZhIHNlIHBvZHLDrWFuIGdlbmVyYXIgYWxndW5hcyBjb25qZXR1cmFzLiBMYSBwcmltZXJhIGRlIGVsbGFzIGVzIHF1ZSBsYXMgcGVyc29uYXMgdGVuw61hbiB1biByZXNwYWxkbyBwYXJhIHBvZGVyIGNvbXByYXIgc3VzIGFsaW1lbnRvcyB5IG1lZGljYW1lbnRvcyBkZSBzZXIgbmVjZXNhcmlvIHBvciBsbyBxdWUgeWEgbm8gdGVuw61hbiBxdWUgc2FsaXIgYSBsYXMgY2FsbGVzIGRlIG1hbmVyYSBjb25jdXJyaWRhIGEgdmVuZGVyIHByb2R1Y3RvcywgZW50cmUgb3RyYXMgY29zYXMuIENhYmUgcmVzYWx0YXIgcXVlIGNvbiBlc3RvIG5vIHF1ZXJlbW9zIGRlY2lyIHF1ZSBsYSBwb2JsYWNpw7NuIG5vIHNhbMOtYSB5IHF1ZSBsYSBtZWRpZGEgZnVlIDEwMCUgZWZlY3RpdmEuIEFsIGNvbnRyYXJpbywgbGEgcG9ibGFjacOzbiBvYmpldGl2byBzYWxpw7MgcGFyYSBoYWNlciBlbCByZXRpcm8gZGVsIHN1YnNpZGlvIHBvciBsbyBxdWUgZWwgbsO6bWVybyBkZSBjYXNvcyBhdW1lbnTDsy4gU2luIGVtYmFyZ28sIGVzdG8gdGFtYmnDqW4gY29udHJpYnV5w7MgYSBxdWUgZW4gZMOtYXMgcG9zdGVyaW9yZXMgc2UgcXVlZGVuIGVuIGNhc2EsIGRlYmlkbyBhIHF1ZSBjb250YWJhbiBjb24gZGluZXJvIHBhcmEgc3Vic2lzdGlyIHBvciB1biBwYXIgZGUgc2VtYW5hcyBtw6FzICh2YXLDrWEgc2Vnw7puIGVsIG7Dum1lcm8gZGUgaW50ZWdyYW50ZXMpLiBFc3RhcyBhZmlybWFjaW9uZXMgc2UgcmVzcGFsZGFuIGNvbiBsYSBtZWRpYSB5IG1lZGlhbmEgYW50ZXMgZGVsIGRlY3JldG8gKGzDrW5lYXMgY29udGludWFzKSwgZGFkbyBxdWUgc2UgdWJpY2EgZW4gbGEgcGFydGUgc3VwZXJpb3IgZGVsIGdyw6FmaWNvLCBtaWVudHJhcyBxdWUgbGEgbWVkaWEgeSBtZWRpYW5hIChsw61uZWFzIHB1bnRlYWRhcykgcG9yIGRlYmFqbyBkZSAtNjAuCgpVdGlsaXphbmRvIHVuIHRlc3QtdCBwYXJhIG1lZGlhcyBlbiBhbWJhcyBzZWNjaW9uZXMgZGUgbGEgZ3LDoWZpY2EsIHBvZGVtb3MgZGV0ZXJtaW5hciBzaSBleGlzdGUgdW4gZWZlY3RvIGRlIGxhIG1lZGlkYSBwb3Igc29icmUgbGEgdHJlbmQgZ2VuZXJhbC4KCiogSG8gOiBObyAgZXhpc3RlbiBkaWZlcmVuY2lhcyBzaWduaWZpY2F0aXZhcyBlbnRyZSBhbWJhcyBzZWNjaW9uZXMgZGUgbGEgZ3LDoWZpY2EuCiogSGEgOiBFeGlzdGVuIGRpZmVyZW5jaWFzIHNpZ25pZmljYXRpdmFzIGVudHJlIGFtYmFzIHNlY2Npb25lcyBkZSBsYSBncsOhZmljYS4KCnx0IC0gVGVzdCBUd28gU2FtcGxlIEFzc3VtaW5nIFVuZXF1YWwgVmFyaWFuY2VzIHwKfC0tLXwtLS0tLS0tLS0tfC0tLS0tLXwKfCB8IFZhcmlhYmxlIDF8IFZhcmlhYmxlIDJ8CnwtLS18LS0tLS0tLS0tLXwtLS0tLS18CnxNZWFuICB8LTkuMzMzMzMzMzN8IC03NC41fAp8VmFyaWFuY2UgIHwxMzV8NS4zODg4ODg4ODl8CnxPYnNlcnZhdGlvbnMgfDl8IDEwfAp8SHlwb3RoZXNpemVkIE1lYW4gRGlmZmVyZW5jZSAgfDB8IHwKfGRmIHw5fCB8Cnx0IFN0YXQgIHwxNi41MzE2MjQyOHwgfAp8UChUIDw9IHQpIG9uZSAtIHRhaWwgIHwyLjQxNzgxRS0wOHwgfAp8dCBDcml0aWNhbCBvbmUgLSB0YWlsIHwxLjgzMzExMjkzM3wgfAp8UChUIDw9IHQpIHR3byAtIHRhaWwgIHw0LjgzNTYzRS0wOHwgfAp8dCBDcml0aWNhbCB0d28gLSB0YWlsICB8Mi4yNjIxNTcxNjN8IHwKfC0tLXwtLS0tLS0tLS0tfC0tLS0tLXwKCkRhZG8gcXVlIGVsIGVzdGFkw61zdGljbyB8dHwgPiB0LWNyw610aWNvIGRvcyBjb2xhcywgc2UgZW5jdWVudHJhIGV2aWRlbmNpYSBwYXJhIGZhbHNlYXIgbGEgaGlww7N0ZXNpcyBudWxhLiBEYWRvIHF1ZSBQKFQ8PXQpIDwgzrEsIGxhIGVsZWNjacOzbiBlcyBqdXN0aWZpY2FibGUsIHBvciBsbyBxdWUgc2UgcmVjaGF6YSBsYSBoaXDDs3Rlc2lzIG51bGEsIGNvbmNsdXllbmRvIHBvciB0YW50byBxdWUgZXhpc3RlIHVuYSBkaWZlcmVuY2lhIHNpZ25pZmljYXRpdmEgZW50cmUgYW1iYXMgc2VjY2lvbmVzIGRlIGxhIGdyw6FmaWNhLiBEZWJpZG8gYSBxdWUgbGEgY29ycmVsYWNpw7NuIGVzIG5lZ2F0aXZhLCBzZSBjb25jbHV5ZSBxdWUgbGEgbWVkaWRhIHJlZHVqbyBsYSBtb3ZpbGl6YWNpb24gcmVjcmVhY2lvbmFsLgoKIyMgU2FsaWRhIGFsdGVybmFkYSBwb3IgZ8OpbmVybwoKRWwgZ3LDoWZpY28gMTAgZXhoaWJlIGxhIGNhbnRpZGFkIGRlIGNhc29zIGFudGVzIHkgZGVzcHXDqXMgZGUgYXBsaWNhcnNlIGxhIG1lZGlkYSDigJxTYWxpZGEgYWx0ZXJuYWRhIHBvciBnw6luZXJv4oCdLiBFbiB1biBwcmltZXIgbW9tZW50byBlc3RhIG1lZGlkYSB0ZW7DrWEgY29tbyBvYmpldGl2byBkaXNtaW51aXIgZWwgbsO6bWVybyBkZSBjb250YWdpb3MuIFBvciB0YWwgcmF6w7NuLCBlbCBHb2JpZXJubyBkZWNyZXTDsyBkZXRlcm1pbmFkb3MgZMOtYXMgZGUgc2FsaWRhIHBhcmEgbXVqZXJlcyB5IG90cm9zIHBhcmEgdmFyb25lcywgeSBsb3MgZG9taW5nb3MgbmFkaWUgc2Fsw61hLiBObyBvYnN0YW50ZSwgYSBwYXJ0aXIgZGUgbGEgcmVwcmVzZW50YWNpw7NuIHNlIHB1ZWRlIG9ic2VydmFyIHF1ZSBlbCBuw7ptZXJvIGRlIGNhc29zIGF1bWVudMOzIGRlIGFwcm94aW1hZGFtZW50ZSBjaWVuIGEgbWlsIGNpZW4gY2Fzb3MuIERlc3B1w6lzIGRlIGxvcyByZXBvcnRhamVzIHZpc3RvcywgcG9kcsOtYW1vcyB0cmF0YXIgZGUgZXhwbGljYXIgZXN0ZSBjb21wb3J0YW1pZW50byBiYXPDoW5kb25vcyBlbiBsbyBzaWd1aWVudGU6IGxhcyBtYW3DoXMgY29uc2lkZXJhbiBxdWUgbG9zIHZhcm9uZXMgKGVzcG9zb3MpIG5vIHNhYmVuIGhhY2VyIGxhcyBjb21wcmFzIGRlIG1lcmNhZG8uIEFsZ3Vub3MgZGlyw61hbiBxdWUgZXN0byBubyB0aWVuZSBmdW5kYW1lbnRvLCBwZXJvIGFuYWxpemFuZG8gZGV0YWxsYWRhbWVudGUgbG9zIHJlcG9ydGFqZXMsIHB1ZGltb3MgcmVjb25vY2VyIHF1ZSBlbiBsb3MgZMOtYXMgZGUgc2FsaWRhIGRlIG11amVyZXMgaGFiw61hIG11Y2hhIG3DoXMgYWdsb21lcmFjacOzbiB5IGRlc29yZGVuLCBhIGRpZmVyZW5jaWEgZGUgbG9zIGTDrWFzIGVuIHF1ZSBsZXMgdG9jYWJhIHNhbGlyIGEgbG9zIHZhcm9uZXMuCgpgYGB7cixlY2hvPUZBTFNFLG1lc3NhZ2U9RkFMU0UscmVzdWx0cz0iYXNpcyJ9CmNhdF9wbG90KGx1YnJpZGF0ZTo6eW1kKCIyMDIwLTA0LTAzIiksIDEwLCAiR3LDoWZpY28gMTAuIFNhbGlkYSBhbHRlcm5hZGEgcG9yIGfDqW5lcm8iLCBwbG90X25ld19jYXNlcywgIk51ZXZvcyBjYXNvcyIpCmBgYApQYXJhIGNvbXByb2JhciBlc3RhZMOtc3RpY2FtZW50ZSBzaSBlcyBxdWUgbGEgbWVkaWRhIGZ1ZSBlZmVjdGl2YSBvIG5vLCBzZSByZWFsaXrDsyBlbCB0ZXN0IEYgc29icmUgbGEgZm9ybWEgbG9nYXLDrXRtaWNhIGRlIGxhIHJlZ3Jlc2nDs24uIERlYmlkbyBhIHF1ZSBsYSByZWdyZXNpw7NuIG5vIHNlIGNlbnRyYSBlbiAwLCBzZSBub3JtYWxpemFyb24gbG9zIHB1bnRvcyBwcmV2aWFtZW50ZS4KCiogSG8gOiBObyBleGlzdGUgZGlmZXJlbmNpYXMgc2lnbmlmaWNhdGl2YXMgZW50cmUgbG9zIGRvcyBzZXRzIGRlIHB1bnRvcy4KKiBIYSA6IEV4aXN0ZSBkaWZlcmVuY2lhcyBzaWduaWZpY2F0aXZhcyBlbnRyZSBlbCBzZXQgZGUgcHVudG9zIGFudGVzIHkgZGVzcHVlcyBkZSBhcGxpY2Fyc2UgbGEgbWVkaWRhLgoKfEYgLSBUZXN0IFR3byAtIFNhbXBsZSBmb3IgVmFyaWFuY2VzIHwKfC0tLXwtLS0tLS0tLS0tfC0tLS0tLXwKfCB8IFZhcmlhYmxlIDF8IFZhcmlhYmxlIDIgfAp8LS0tfC0tLS0tLS0tLS18LS0tLS0tfAp8TWVhbiAgfDQuODIwOTM5fCA2LjY2NjU0MnwKfFZhcmlhbmNlICB8MC4zNjY4MDh8IDAuMTQwMTY5fAp8T2JzZXJ2YXRpb25zIHwxMHwgMTB8CnxkZiAgfDl8IDl8CnxGICB8Mi42MTY5MDF8IHwKfFAgKEYgPD0gZikgb25lLXRhaWwgIHwwLjE1MDk0NHwKfEYgY3LDrXRpY28gb25lLXRhaWwgIHw0Ljc3MjQ2NnwgfAp8LS0tfC0tLS0tLS0tLS18LS0tLS0tfAoKRGFkbyBxdWUgRiA8IEYtY3LDrXRpY28gdW5hIGNvbGEsIG5vIHNlIHB1ZWRlIGZhbHNlYXIgbGEgaGlww7N0ZXNpcyBudWxhLiBBZGVtw6FzLCBjb21vUChGPD1mKSB1bmEgY29sYSA+IDAuMDUsIHNlIGRlY2lkZSBtYW50ZW5lciBsYSBoaXDDs3Rlc2lzIG51bGEsIGNvbnNpZGVyYW5kbyBxdWUgbm8gZXhpc3RlbiBkaWZlcmVuY2lhcyBzaWduaWZpY2F0aXZhcy4gQ29uIGVzdG8sIHNlIGNvbXBydWViYSBxdWUgbGEgbWVkaWRhIG5vIHR1dm8gw6l4aXRvIGVuIHJlZHVjaXIgbG9zIG51ZXZvcyBjYXNvcy4KCmBgYHtyLGVjaG89RkFMU0UsbWVzc2FnZT1GQUxTRSxyZXN1bHRzPSJhc2lzIn0KY2F0X3Bsb3QobHVicmlkYXRlOjp5bWQoIjIwMjAtMDQtMDMiKSwgMTAsICJHcsOhZmljbyAxMS4gU2FsaWRhIGFsdGVybmFkYSBwb3IgZ8OpbmVybyIsIHBsb3Rfcm1vdmVzLCAiTW92aWxpemFjacOzbiByZWNyZWFjaW9uYWwiKQpgYGAKU2UgcHVlZGUgb2JzZXJ2YXIgdW4gbGV2ZSBjYW1iaW8gZW4gbGEgcG9zaWNpw7NuIGRlIGxhcyBtZWRpYXMgZGUgYW1ib3MgZGF0YXNldHMuIFBhcmEgY29tcHJvYmFyIGxhIHNpZ25pZmljYW5jaWEgZGUgZXN0YSBkaWZlcmVuY2lhLCBzZSBwbGFudGVhIHVuIHRlc3QtdC4gQXN1bWllbmRvOgoKKiBIbzogTm8gc2UgcHVlZGUgZW5jb250cmFyIGRpZmVyZW5jaWFzIHNpZ25pZmljYXRpdmFzIGVudHJlIGxhcyBkb3MgZmFzZXMuCgoqIEhhOiBFeGlzdGVuIGRpZmVyZW5jaWFzIHNpZ25pZmljYXRpdmFzIGVudHJlIGFudGVzIGRlIGRlY2xhcmFyc2UgbGEgbWVkaWRhIHkgdHJhcyBzdSBlamVjdWNpw7NuLgoKCnx0IC0gVGVzdDogUGFpcmVkIFR3byBTYW1wbGUgZm9yIE1lYW5zIHwKfC0tLXwtLS0tLS0tLS0tfC0tLS0tLXwKfCB8IC03NXwgLTc2IHwKfC0tLXwtLS0tLS0tLS0tfC0tLS0tLXwKfE1lYW4gIHwtNzQuMTExMXwgLTg1LjMzMzN8CnxWYXJpYW5jZSAgfDAuOTIzNjExfCA2OXwKfE9ic2VydmF0aW9ucyB8OXwgOXwKfFBlYXJzb24gQ29ycmVsYXRpb24gIHwtMC42ODYzNXwgfAp8SHlwb3RoZXNpemVkIE1lYW4gRGlmZmVyZW5jZSAgfDh8IHwKfGRmIHw4fCB8Cnx0IFN0YXQgIHwxLjA3NDg1OHwgfAp8UChUIDw9IHQpIG9uZSAtIHRhaWwgIHwwLjE1Njg5MnwgfAp8dCBDcml0aWNhbCBvbmUgLSB0YWlsIHwxLjg1OTU0OHwgfAp8UChUIDw9IHQpIHR3byAtIHRhaWwgIHwwLjMxMzc4NHwgfAp8dCBDcml0aWNhbCB0d28gLSB0YWlsICB8Mi4zMDYwMDR8IHwKfC0tLXwtLS0tLS0tLS0tfC0tLS0tLXwKCgpEYWRvIHF1ZSB8dFN0YXR8IDwgdCBjcml0aWNvIGRvcyBjb2xhcywgbm8gc2UgcHVlZGUgZW5jb250cmFyIGV2aWRlbmNpYSBxdWUgbmllZ3VlIEhvLiBEYWRvIGFkZW3DoXMgcXVlIFAoVDw9dCkgPiDOsSwgbm8gc2UgbGxlZ2EgYSByZWNoYXphciBsYSBoaXDDs3Rlc2lzIG51bGEsIHBvciBsbyBxdWUgc2UgYXN1bWUgcXVlIG5vIGV4aXN0ZW4gZGlmZXJlbmNpYXMgc2lnbmlmaWNhdGl2YXMgdHJhcyBsYSBtZWRpZGEuCgpBIHBhcnRpciBkZSBlc3RlIGdyw6FmaWNvIHNlIHB1ZWRlIG9ic2VydmFyIHVuYSBzaW1pbGl0dWQgZW4gZWwgY29tcG9ydGFtaWVudG8gY29uIHRvZG9zIGxvcyBkZW3DoXMgYW5hbGl6YWRvcyBoYXN0YSBlc3RlIHB1bnRvLiBTaSBiaWVuIGVzIGNpZXJ0byBsYXMgdHJlcyBtZWRpZGFzIGZ1bmNpb25hbiBiaWVuIHBhcmEgZGlzbWludWlyIGxhIG1vdmlsaXphY2nDs24sIHBlcm8gY29uIGVsIG5pdmVsIGRlIGNhc29zIGRlIENvdmlkLTE5IHN1Y2VkZSBsbyBjb250cmFyaW8sIGRhZG8gcXVlIGVzdG9zIGF1bWVudGFuIGRlIG1hbmVyYSBzaWduaWZpY2F0aXZhLiBFcyBuZWNlc2FyaW8gZGVzdGFjYXIgcXVlIGhheSBmZWNoYXMgZW4gbGFzIHF1ZSBkaXNtaW51eWUgeSBvdHJhcyBlbiBsYXMgcXVlIGF1bWVudGEuIE5vIG9ic3RhbnRlLCB1biBjYW1iaW8gbm90b3JpbyBzdWNlZGUgYSBwYXJ0aXIgZGVsIDYgZGUgYWJyaWwsIGRvbmRlIGxhIG1vdmlsaXphY2nDs24gZXN0w6EgcG9yIGRlYmFqbyBkZSAtOTAgYXByb3hpbWFkYW1lbnRlLiBFbCBjYW1iaW8gZGUgbW92aWxpemFjacOzbiBwdWVkZSBlc3RhciBmdW5kYW1lbnRhZGEgcG9ycXVlIHBhcnRlIGRlIGxhIHBvYmxhY2nDs24gbm8gc2Fsw61hIGVsIG1pc21vIGTDrWEuIFBlcm8sIHNpIGRpc21pbnV5w7MgbGEgbW92aWxpemFjacOzbiDCv3BvciBxdcOpIGF1bWVudGFyb24gbG9zIGNhc29zPyBQYXJhIHJlc3BvbmRlciBlc3RhIHByZWd1bnRhLCBub3MgYmFzYXJlbW9zIGVuIGVsIGdyw6FmaWNvIGFudGVyaW9yLCBkb25kZSBvYmpldGFtb3MgcXVlIGxhcyBtYWRyZXMgbm8gcHVlZGVuIGRlamFyIGVsIGNvbnRyb2wgbyBjb25maWFuemEgYSBzdXMgZXNwb3NvcyBwYXJhIHF1ZSBzZSBlbmNhcmd1ZW4gZGUgbGEgZGlzcGVuc2EuIExhIG1heW9yw61hIG9wdGFiYSBwb3Igc2FsaXIgYSBjb21wcmFyIHVuIGTDrWEgaMOhYmlsIHkgbGEgbWlzbWEgYWdsb21lcmFjacOzbiwgZGVzb3JkZW4geSBlbCBubyBkaXN0YW5jaWFtaWVudG8gY29udHJpYnV5ZSBhIGxhIGFjZWxlcmFjacOzbiBkZSBsYSBwcm9wYWdhY2nDs24gZGVsIHZpcnVzLgoKIyMgUGVybWlzbyBkZSBhZHF1aXNpY2nDs24gZGUgYmllbmVzIHkgc2VydmljaW9zIGLDoXNpY29zCgpFbiBlbCBncsOhZmljbyBuw7ptZXJvIDEyIGhheSB1bmEgb2JzZXJ2YWNpw7NuIG11eSBwb2NvIGV2aWRlbnRlIHF1ZSBzZSBwdWVkZSB2ZXIuIFBvY29zIGTDrWFzIGFudGVyaW9yZXMgYSBsYSBpbXBsZW1lbnRhY2nDs24gZGUgbGEgbWVkaWRhIGVuIGNvbnNpZGVyYWNpw7NuLCBsb3MgbnVldm9zIGNhc29zIGVtcGV6YXJvbiBhIGluY3JlbWVudGFyIGRlc3B1w6lzIGRlIGhhYmVyc2UgbWFudGVuaWRvIHJlbGF0aXZhbWVudGUgY29uc3RhbnRlcyBwb3IgdW4gdGllbXBvLiBFbCBpbmNyZW1lbnRvIGRlIGVzdG9zIG51ZXZvcyBjYXNvcyBhbCBwYXJlY2VyIGZ1ZSBjb250cm9sYWRvIHBvciB1bm9zIGRpYXMgcG9zdGVyaW9yZXMgZGUgc2VyIHRvbWFkYSBsYSBtZWRpZGEuIFNpbiBlbWJhcmdvLCBlbiBsYSBncsOhZmljYSBzZSBwdWVkZSB2aXN1YWxpemFyIHF1ZSBhcHJveGltYWRhbWVudGUgdW5hIHNlbWFuYSBkZXNwdcOpcyBkZSBoYWJlcnNlIHRvbWFkbyBlc3RhIG1lZGlkYSBsb3MgY2Fzb3MgZW1wZXphcm9uIGEgaW5jcmVtZW50YXIgbnVldmFtZW50ZS4KCmBgYHtyLGVjaG89RkFMU0UsbWVzc2FnZT1GQUxTRSxyZXN1bHRzPSJhc2lzIn0KY2F0X3Bsb3QobHVicmlkYXRlOjp5bWQoIjIwMjAtMDQtMjAiKSwgMTAsICJHcsOhZmljbyAxMi4gUGVybWlzbyBkZSBhZHF1aXNpY2nDs24gZGUgYmllbmVzIHkgc2VydmljaW9zIGJhc2ljb3MiLCBwbG90X25ld19jYXNlcywgIk51ZXZvcyBjYXNvcyIpCmBgYApQYXJhIGNvbXByb2JhciBsYSBzaWduaWZpY2FuY2lhIGRlIGVzdGEgZGlmZXJlbmNpYSwgc2UgcGxhbnRlYSB1biB0ZXN0LWYuIEFzdW1pZW5kbyBhIGxvcyBwdW50b3MgdWJpY2Fkb3MgYW50ZXMgZGUgbGEgYXBsaWNhY2nDs24gZGUgbGEgbWVkaWRhIGNvbW8gY29udHJvbDoKCiogSG86IE5vIHNlIHB1ZWRlIGVuY29udHJhciBkaWZlcmVuY2lhcyBzaWduaWZpY2F0aXZhcyBlbnRyZSBsYSBmYXNlIGRlIGNvbnRyb2wgeSB0cmFzIGFwbGljYXIgbGEgbWVkaWRhLgoKKiBIYTogRXhpc3RlbiBkaWZlcmVuY2lhcyBzaWduaWZpY2F0aXZhcyBlbnRyZSBhbnRlcyBkZSBkZWNsYXJhcnNlIGxhIG1lZGlkYSB5IHRyYXMgc3UgZWplY3VjacOzbi4KCgp8RiAtIFRlc3QgVHdvIC0gU2FtcGxlIGZvciBWYXJpYW5jZXMgfAp8LS0tfC0tLS0tLS0tLS18LS0tLS0tfAp8IHwgVmFyaWFibGUgMXwgVmFyaWFibGUgMiB8CnwtLS18LS0tLS0tLS0tLXwtLS0tLS18CnxNZWFuICB8MC4xNjIyMTV8IDAuODY1ODc1fAp8VmFyaWFuY2UgIHwwLjA3OTczOXwgMC4wNzYzMDd8CnxPYnNlcnZhdGlvbnMgfDEwfCAxMHwKfGRmICB8OXwgOXwKfEYgIHwxLjA0NDk2N3wgfAp8UCAoRiA8PSBmKSBvbmUtdGFpbCAgfDAuNDc1OTYxfAp8RiBjcsOtdGljbyBvbmUtdGFpbCAgfDEuNzM5NjA2NzI2fCB8CnwtLS18LS0tLS0tLS0tLXwtLS0tLS18CgoKRGFkbyBGIDwgRi1jcsOtdGljbyB1bmEgY29sYSwgbm8gc2UgZW5jdWVudHJhIGV2aWRlbmNpYSBlbiBjb250cmEgZGUgbGEgaGlww7N0ZXNpcyBudWxhLiBDb21vIFAoRjw9Zik+MC4wNSwgbm8gc2UgcmVjaGF6YSBIbywgYXN1bWllbmRvIHBvciB0YW50byBxdWUgbm8gZXhpc3RlbiBkaWZlcmVuY2lhcyBzaWduaWZpY2F0aXZhcyBlbiBlbCByYXRpbyBkZSBhcGFyaWNpw7NuIGRlIG51ZXZvcyBjYXNvcy4KCmBgYHtyLGVjaG89RkFMU0UsbWVzc2FnZT1GQUxTRSxyZXN1bHRzPSJhc2lzIn0KY2F0X3Bsb3QobHVicmlkYXRlOjp5bWQoIjIwMjAtMDQtMjAiKSwgMTAsICJHcsOhZmljbyAxMy4gUGVybWlzbyBkZSBhZHF1aXNpY2nDs24gZGUgYmllbmVzIHkgc2VydmljaW9zIGJhc2ljb3MiLCBwbG90X3Jtb3ZlcywgIk1vdmlsaXphY2nDs24gcmVjcmVhY2lvbmFsIikKYGBgCkVuIGVzdGEgZ3LDoWZpY2EgcG9kZW1vcyB2ZXIgcXVlIGxhIG1lZGlkYSBkZSBwZXJtaXNvIGRlIGFkcXVpc2ljacOzbiBkZSBiaWVuZXMgeSBzZXJ2aWNpb3MgYsOhc2ljb3Mgbm8gYWZlY3TDsyBkZSBtYW5lcmEgZXZpZGVudGUgbGEgbW92aWxpemFjacOzbiBzb2NpYWwsIHlhIHF1ZSBubyBzZSBwdWVkZSB2ZXIgdW5hIHJlZHVjY2nDs24gbyBpbmNyZW1lbnRvIHRvdGFsbWVudGUgY2xhcm8gZW4gbG9zIGTDrWFzIHBvc3RlcmlvcmVzIGEgbGEgaW1wbGVtZW50YWNpw7NuIGRlIGVzdGEgbWVkaWRhLiBTZSBwdWVkZSBvYnNlcnZhciBlc3RvIG1lZGlhbnRlIHVuIHQtdGVzdC4gQXN1bWllbmRvIGFzw606CgoqIEhvID0gTm8gZXhpc3RlIGRpZmVyZW5jaWEgYW50ZXMgeSBkZXNwdcOpcyBkZSBhcGxpY2Fyc2UgbGEgbWVkaWRhCgoqIEhhID0gRXhpc3RlbiBkaWZlcmVuY2lhcyBzaWduaWZpY2F0aXZhcyBlbiBsYSBtb3ZpbGl6YWNpw7NuIGVudHJlIGVsIHBlcmlvZG8gcHJldmlvIGEgbGEgZGVjbGFyYWNpw7NuICB5IGVsIHBvc3Rlcmlvci4KCgp8dCAtIFRlc3Q6IFR3by1TYW1wbGUgQXNzdW1pbmcgVW5lcXVhbCBWYXJpYW5jZXMgfAp8LS0tfC0tLS0tLS0tLS18LS0tLS0tfAp8IHwgVmFyaWFibGUgMXwgVmFyaWFibGUgMiB8CnwtLS18LS0tLS0tLS0tLXwtLS0tLS18CnxNZWFuICB8LTgwLjR8IC03Ni42fAp8VmFyaWFuY2UgIHw2OC4yMTExMTExMXwgMzcuODIyMjIyMjJ8CnxPYnNlcnZhdGlvbnMgfDEwfCAxMHwKfEh5cG90aGVzaXplZCBNZWFuIERpZmZlcmVuY2UgIHwwfCB8CnxkZiB8MTd8IHwKfHQgU3RhdCAgfC0xLjE2Njk3NzI0OXwgfAp8UChUIDw9IHQpIG9uZSAtIHRhaWwgIHwwLjEyOTY2NDM5OXwgfAp8dCBDcml0aWNhbCBvbmUgLSB0YWlsIHwxLjczOTYwNjcyNnwgfAp8UChUIDw9IHQpIHR3byAtIHRhaWwgIHwwLjI1OTMyODc5OXwgfAp8dCBDcml0aWNhbCB0d28gLSB0YWlsICB8Mi4xMDk4MTU1Nzh8IHwKfC0tLXwtLS0tLS0tLS0tfC0tLS0tLXwKCgpEYWRvIHF1ZSB8dHwgPCB0LWNyw610aWNvLCBubyBzZSBwdWVkZSBzb2x2ZW50YXIgbGEgaWRlYSBkZSByZWNoYXphciBsYSBoaXDDs3Rlc2lzIGRpcmVjdGFtZW50ZS4gRGFkbyBhZGVtw6FzIHF1ZSAgUChUPHQpID4gzrEgLCBubyBzZSBsbGVnYSBhIHJlY2hhemFyIGNvbXBsZXRhbWVudGUgSG8sIHBvciBsbyBxdWUgc2UgYXN1bWUgcXVlIG5vIGV4aXN0ZW4gZGlmZXJlbmNpYXMgc2lnbmlmaWNhdGl2YXMuCgojIyDCv0N1w6FsZXMgZXJhbiBsYXMgcmF6b25lcyBwb3IgbGFzIHF1ZSBsYSBwb2JsYWNpw7NuIHNhbMOtYSBkdXJhbnRlIGxhIGN1YXJlbnRlbmE/CgojIyMgUmF6b25lcwpgYGB7cn0KCmRmX2Zvcm0yJHJhem9uZXMgJT4lIHVubGlzdCgpICU+JSB0YWJsZSgpIC0+IHJhem9uZXNfdAp3b3JkY2xvdWQobmFtZXMocmF6b25lc190KSwgYXMudmVjdG9yKHJhem9uZXNfdCksIG1pbi5mcmVxID0gMikKCnRpdGxlKCJHcsOhZmljbyAxNC4gUmF6b25lcyBwYXJhIHNhbGlyIGR1cmFudGUgbGEgY3VhcmVudGVuYSIpCmBgYAoKRWwgZ3LDoWZpY28gYW50ZXJpb3IgbWFuaWZpZXN0YSBhbGd1bmFzIGRlIGxhcyByYXpvbmVzIHF1ZSBqdXN0aWZpY2FuIGxhcyBzYWxpZGFzIGRlIGNhc2EgZGUgbGEgcG9ibGFjacOzbiBlbmN1ZXN0YWRhIGR1cmFudGUgbGEgY3VhcmVudGVuYS4gRXMgbmVjZXNhcmlvIGRlc3RhY2FyIHF1ZSBlc3RhIGdyw6FmaWNhIHNlIHJlbGFjaW9uYSBtdWNobyBjb24gbGEgZ3LDoWZpY2EgNiw4LDEwIHkgMTIsIGRhZG8gcXVlIGV4cGxpY2Fyw61hIGRlIGFsZ8O6biB1IG90cm8gbW9kbyBlbCBhdW1lbnRvIGRlIGNhc29zLiBMYSByYXrDs24gY29uIG1heW9yIHBvcmNlbnRhamUgZXMgbGEgY29taWRhLCBsYSBxdWUgbGUgY29udGluw7phIHNvbiBsb3MgbWVkaWNhbWVudG9zIHkgcG9yIMO6bHRpbW8gZWwgdHJhYmFqby4KCiMjIyBGcmVjdWVuY2lhIGRlIHNhbGlkYQpgYGB7cn0KZGZfZm9ybTIgJT4lCiAgICBncm91cF9ieShzYWxpZGFzKSAlPiUKICAgIHN1bW1hcmlzZShuPW4oKSkgJT4lCiAgICBiYXJwbG90KG5+c2FsaWRhcywgZGF0YT0uLCB5bGFiID0gIlBlcnNvbmFzIiwgeGxhYj0iU2FsaWRhcyIpCgp0aXRsZSgiR3LDoWZpY28gMTUuIFNhbGlkYXMgcG9yIHNlbWFuYSIpCmBgYAoKRXN0ZSBncsOhZmljbyBzZSByZWxhY2lvbmEgbXVjaG8gY29uIGVsIGFudGVyaW9yLCBkYWRvIHF1ZSBleGhpYmUgbGFzIHNhbGlkYXMgcG9yIHNlbWFuYSBkZSBsYSBwb2JsYWNpw7NuIG11ZXN0cmEuIExhIGdyw6FmaWNhIGNvbnRpZW5lIHVuIHB1bnRvIG3DoXhpbW8gZW4gMiwgYWRlbcOhcyBkZSBvdHJvIG3DoXhpbW8gbG9jYWwgZW4gNS4gTGEgbWVkaWEgeSBsYSBtZWRpYW5hIHNvbiAzLjA2IHkgMyByZXNwZWN0aXZhbWVudGUsIGxvIHF1ZSBwcm92ZWUgdW4gYnVlbiBlc3RpbWFkb3IgZGUgbGFzIHNhbGlkYXMgcHJvbWVkaW8gZGUgbGFzIHBlcnNvbmFzIGVuY3Vlc3RhZGFzLgoKIyMgRnJlY3VlbmNpYSBkZSBzYWxpZGEgVlMgSW5ncmVzb3MKYGBge3J9CgpnZ3Bsb3QoYWVzKHggPXNhbGlkYXNfLCB5ID0gaW5ncmVzbywgZ3JvdXA9aW5ncmVzbyksIGRhdGEgPSBkZl9mb3JtMikgKwogICAgZ2VvbV9ib3hwbG90KCkgKwogICAgZ2d0aXRsZSgiU2FsaWRhcyB2cyBpbmdyZXNvcyIpICsKICAgIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUpKQoKYGBgCgpQYXJhIGVsIHJhbmdvIG3DoXMgYmFqbyBkZSBpbmdyZXNvcyBbMC0xMDAwXSBzb2xlcywgZGUgYWN1ZXJkbyBhIGxhIGNhamEgZGUgYmlnb3Rlcywgc2Ugb2J0dXZvIHVuYSBtZWRpYW5hIGRlIDIgZW4gbGEgZnJlY3VlbmNpYSBkZSBzYWxpZGEuIEVzdG8gZXZpZGVuY2lhIHF1ZSBjYXNpIGVsIDUwJSBpbmNpZGUgZW4gc2FsaXIgbWVub3MgZGUgMiB2ZWNlcyB5IGVsIG90cm8gNTAlIHNhbGUgbcOhcyBkZSAyIHZlY2VzLiBQYXJhIGVsIHJhbmdvIG3DoXMgYWx0byBkZSBpbmdyZXNvcyBbPjEwMDAwXSBsYSBtZWRpYW5hIGVzIDMuIEVsbG8gcmVwcmVzZW50YSBxdWUgZWwgNTAlIGluY2lkZSBlbiBzYWxpciBtw6FzIGRlIDMgdmVjZXMuICBMb3MgaW5ncmVzb3MgZW50cmUgYW1ib3MgcmFuZ29zIG11ZXN0cmFuIHVuYSBmcmVjdWVuY2lhICBkZSBzYWxpZGEgbWVub3IsIGxhIGN1YWwgZmF2b3JlY2UgZW4gbWVkaWFuYSBhIHNhbGlkYXMgbWVub3JlcyBxdWUgMyB5IDIuIEEgbWVkaWRhIHF1ZSBpbmNyZW1lbnRhbiBsb3MgaW5ncmVzb3Mgbm8gc2UgZXZpZGVuY2lhIHVuIGNvbXBvcnRhbWllbnRvIGRlZmluaWRvIHBhcmEgbGFzIGZyZWN1ZW5jaWFzIGRlIHNhbGlkYSwgcGVybyBzaSB1biBmYXZvcmVjaW1pZW50byBhIG1lbm9yZXMgc2FsaWRhcyBxdWUgZWwgcmFuZ28gbcOhcyBiYWpvIGRlIGluZ3Jlc29zLiBMYSDDum5pY2EgZXhjZXBjacOzbiBzZSBkYSBwYXJhIGVsIHJhbmdvIG3DoXMgYWx0byBkZSBpbmdyZXNvcy4KCmBgYHtyfQpnZ3Bsb3QoYWVzKHg9c2FsaWRhc18sIHk9aW5ncmVzbywgZ3JvdXA9c2FsaWRhc18pLCBkYXRhID0gZGZfZm9ybTIpICtnZW9tX2NvdW50KCkKYGBgCkVzdGEgc2VndW5kYSBncsOhZmljYSBtdWVzdHJhIGxhIGNhbnRpZGFkIGRlIG9ic2VydmFjaW9uZXMgcG9yIGluZ3Jlc28geSBmcmVjdWVuY2lhIGRlIHNhbGlkYS4gU2Ugb2JzZXJ2YSBxdWUgcGFyYSAwIHNhbGlkYXMgLCBhIG1lZGlkYSBxdWUgYXVtZW50YW4gbG9zIGluZ3Jlc29zIG1lbm9zIHBlcnNvbmFzIGluY2lkZW4gZW4gZXN0YS4gRWwgbWlzbW8gY29tcG9ydGFtaWVudG8gc2UgZGEgcGFyYSAxIHNhbGlkYSwgNSBzYWxpZGFzLiBFcyBzaW1pbGFyIGVsIGNvbXBvcnRhbWllbnRvIHBhcmEgMiwzLDYgc2FsaWRhcyBzb2xvIHF1ZSBleGlzdGVuIHZhcmlhY2lvbmVzIG3DoXMgbm90b3JpYXMuIEFzaW1pc21vLCBzZSBtdWVzdHJhIHF1ZSBsb3MgcmFuZ29zIG3DoXMgYmFqb3MgZGUgaW5ncmVzb3MgWzAsMTAwMF0sWzEwMDAsMjAwMCkgcHJlc2VudGFuIG1heW9yIGNhbnRpZGFkIGRlIG9ic2VydmFjaW9uZXMgZGUgMCBhIDYgc2FsaWRhcy4KCiNGcmVjdWVuY2lhIGRlIHNhbGlkYSB2cy4gRWRhZApgYGB7cn0KZ2dwbG90KGFlcyh4ID0gc2FsaWRhc18sIHkgPSBlZGFkLCBncm91cCA9IHNhbGlkYXNfKSwgZGF0YSA9IGRmX2Zvcm0yKSArIGdlb21fYm94cGxvdCgpICsgIGdndGl0bGUoIlNhbGlkYXMgdnMgZWRhZCIpICsgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSkpCgpgYGAKCkVzdGEgZ3LDoWZpY2EgbXVlc3RyYSBxdWUgbGFzIG1lZGlhbmFzIGRlIGxhcyBlZGFkZXMgY2FtYmlhbiBsaWdlcmFtZW50ZSBjb24gbGEgZnJlY3VlbmNpYSBkZSBzYWxpZGEuIFBhcmEgMCBzYWxpZGFzIGhheSBwZXJzb25hcyAxOC0zMiBhw7FvcyBxdWUgYWJhcmNhbiAyNSUgeSA3NSUgZGVsIHRvdGFsLiBQYXJhIDEgc2FsaWRhIGV4aXN0ZW4gcGVyc29uYXMgY29uIG3DoXMgZWRhZCAgZGUgMjUtIDQ1IGHDsW9zIHF1ZSBvY3VwYW4gZWwgcmFuZ28gaW50ZXJjdWFydMOtbGljby4gUGFyYSAyLDMgc2FsaWRhcyBzZSBtYW50aWVuZSBlc2UgcmFuZ28gZGUgZWRhZGVzIHkgbGEgbWVkaWFuYSBjYW1iaWEgY2FzaSBuYWRhLiBQYXJhIDUsNiBzYWxpZGFzIGxhIG1lZGlhbmEgbm8gYXVtZW50YSBuaSBkaXNtaW51eWUgc2lnbmlmaWNhdGl2YW1lbnRlLiBVbiBhdW1lbnRvIGRlIGxhIG1lZGlhbmEgYSBtZWRpZGEgcXVlIGF1bWVudGEgbGEgZnJlY3VlbmNpYSBkZSBzYWxpZGEgaW1wbGljYXJpYSBxdWUgZW4gY2FkYSBmcmVjdWVuY2lhIGRlIHNhbGlkYSBjYXNpIGVsIDUwJSBsbyBvY3VwZW4gcGVyc29uYXMgZGUgbcOhcyBlZGFkIHF1ZSBsYSBhbnRlcmlvciBmcmVjdWVuY2lhIGRlIHNhbGlkYS4gRGFkbyBxdWUgbm8gc3VjZWRlIGVzdG8sIHNlIGV2aWRlbmNpYW4gIGRpc3RyaWJ1Y2lvbmVzIGFsZ28gc2ltaWxhcmVzLgoKYGBge3J9CmdncGxvdChhZXMoeSA9IHNhbGlkYXNfLCB4ID0gZ2VuZXJvLCBncm91cCA9IGdlbmVybyksIGRhdGEgPSBkZl9mb3JtMiApICsgZ2VvbV9jb3VudCgpICsgIGdndGl0bGUoIkfDqW5lcm8gdnMgc2FsaWRhcyIpICsgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSkpCgpgYGAKTGEgZ3LDoWZpY2EgbXVlc3RyYSBxdWUgbGFzIG9ic2VydmFjaW9uZXMgc29uIG1heW9yZXMgcGFyYSBlbCBnw6luZXJvIG1hc2N1bGluby4gTG9zIGhvbWJyZXMsIGVudHJlIDEtMyBzYWxpZGFzIGluY2lkZW4gbcOhcywgbGFzIG11amVyZXMgZGUgaWd1YWwgZm9ybWEgaW5jaWRlbiBtw6FzIGVuIDEtMyBzYWxpZGFzLiBQYXJhIGxhcyBtdWplcmVzLCBsYSBjYW50aWRhZCBkZSBvYnNlcnZhY2lvbmVzIGluY3JlbWVudGEgZGUgMC0xIHNhbGlkYSwgZW50cmUgMS0zIHNhbGlkYXMgbGEgY2FudGlkYWQgZGUgb2JzZXJ2YWNpb25lcyBlcyBsYSBtaXNtYSAsIGx1ZWdvIGEgbWVkaWRhIHF1ZSBpbmNyZW1lbnRhbiBsYXMgc2FsaWRhcyBsYSBjYW50aWRhZCBkZSBvYnNlcnZhY2lvbmVzIGRpc21pbnV5ZS4gUGFyYSBsb3MgaG9tYnJlcywgbGEgY2FudGlkYWQgZGUgb2JzZXJ2YWNpb25lcyBpbmNyZW1lbnRhIGVudHJlIDAtMiBzYWxpZGFzLCBsdWVnbyBhIG1lZGlkYSBxdWUgYXVtZW50YW4gbGFzIHNhbGlkYXMsIGxhIGNhbnRpZGFkIGRpc21pbnV5ZSB5IHZ1ZWx2ZSBhIGF1bWVudGFyLiBFeGlzdGUgbWF5b3IgZGlzcGVyc2nDs24gcGFyYSBtw6FzIGRlIDMgc2FsaWRhcy4KCmBgYHtyfQpnZ3Bsb3QoYWVzKHkgPSBzYWxpZGFzXywgeCA9IGVtcGxlbywgZ3JvdXAgPSBlbXBsZW8pLCBkYXRhID0gZGZfZm9ybTIgKSArIGdlb21fY291bnQoKSArICBnZ3RpdGxlKCJUaXBvX3RyYWJham8gdnMgc2FsaWRhcyIpICsgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSkpCmBgYAoKTGEgY2FudGlkYWQgZGUgb2JzZXJ2YWNpb25lcyBlcyBtYXlvciBwYXJhIGxhcyBwZXJzb25hcyBjb24gdW4gdHJhYmFqbyBmb3JtYWwuIEVzdGFzIHRpZW5lbiBtYXlvciB2YXJpYWNpw7NuIGVuIGxhIGNhbnRpZGFkIGRlIG9ic2VydmFjaW9uZXMgYSBtZWRpZGEgcXVlIGF1bWVudGFuIGxhcyBzYWxpZGFzLiBQYXJhIGxhcyBwZXJzb25hcyBjb24gdW4gdHJhYmFqbyBpbmZvcm1hbCwgZXhpc3RlIHVuYSBtZW5vciB2YXJpYWNpw7NuIGVuIGxhIGNhbnRpZGFkIGRlIG9ic2VydmFjaW9uZXMuCgoKCiMjIMK/Q3XDoWxlcyBoYW4gc2lkbyBsYXMgbWVkaWRhcyBxdWUgaGFuIHRlbmlkbyBtYXlvciBpbXBhY3RvIGVuIGxhIHBvYmxhY2nDs24/CgojIyBNZWRpZGFzCmBgYHtyfQpwYXIobWFpID0gYygxLCAyLjUsIDAuNSwgMC41KSkKCih0YWJsZShjKAogICAgcmVwKCJJbm1vdmlsaXphY2nDs24iLCAgICAgICAgICAgICAgIGxlbmd0aCh3aGljaChkZl9mb3JtMiRzb2NpYWwuYm9vbCkpKSwKICAgIHJlcCgiTm8gYWNjZXNvIGEgbHVnYXJlcyBww7pibGljb3MiLCBsZW5ndGgod2hpY2goZGZfZm9ybTIkb2Npby5ib29sKSkpLAogICAgcmVwKCJTYWxpZGEgaW50ZXJjYWxhZGEiLCAgICAgICAgICAgbGVuZ3RoKHdoaWNoKGRmX2Zvcm0yJG5vZGF5LmJvb2wpKSksCiAgICByZXAoIkJvbm8iLCAgICAgICAgICAgICAgICAgICAgICAgICBsZW5ndGgod2hpY2goZGZfZm9ybTIkYm9uby5ib29sKSkpLAogICAgcmVwKCJVbiBtb250byBkZWwgQWZwIiwgICAgICAgICAgICAgbGVuZ3RoKHdoaWNoKGRmX2Zvcm0yJGFmcDEuYm9vbCkpKSwKICAgIHJlcCgiVW4gcG9yY2VudGFqZSBkZWwgQWZwIiwgICAgICAgIGxlbmd0aCh3aGljaChkZl9mb3JtMiRhZnAyLmJvb2wpKSkKKSkvbGVuZ3RoKGRmX2Zvcm0yJHNvY2lhbC5ib29sKSkgJT4lCiAgICBzb3J0KFRSVUUpICU+JQogICAgYmFycGxvdChob3JpeiA9IFRSVUUsCiAgICAgICAgICAgIGxhcyA9IDEsCiAgICAgICAgICAgIHlsYWIgPSAiIiwKICAgICAgICAgICAgeGxhYiA9ICJBcHJvYmFjacOzbiIKICAgICkKdGl0bGUoIkdyw6FmaWNvIDE2LiBBcHJvYmFjacOzbiBwb3IgbWVkaWRhIChkZSAwIGEgMSkiKQpgYGAKCkVsIGdyw6FmaWNvIDE2IG11ZXN0cmEgZWwgbml2ZWwgZGUgYXByb2JhY2nDs24gZGUgbGFzIG1lZGlkYXMgcXVlIHNlIGVzdMOhbiBlc3R1ZGlhbmRvLiBObyBvYnN0YW50ZSwgdGFtYmnDqW4gc2UgaGFuIGluY2x1aWRvIGRlbnRybyBkZWwgcGFkcsOzbiBkZSBob2dhcmVzIGVsIG1vbnRvIGRlIEFGUCB5IHVuIHBvcmNlbnRhamUgZGVsIG1pc21vLiBDb24gdW4gbml2ZWwgZGUgYXByb2JhY2nDs24gbWF5b3IgYSAwLjgsIGxhIHBvYmxhY2nDs24gb3B0w7MgcG9yIGxhIG1lZGlkYSDigJxEZWNsYXJhY2nDs24gZGUgRXN0YWRvIGRlIEVtZXJnZW5jaWHigJ0uIERlc2RlIGVsIHB1bnRvIGRlIHZpc3RhIGRlIGxhIHBvYmxhY2nDs24gbGEgaW5tb3ZpbGl6YWNpw7NuIGNvbnRyaWJ1ecOzIGVuIG1heW9yIG1lZGlkYS4gRWwgc2VndW5kbyBsdWdhciBlcyBwYXJhIGVsIG5vIGFjY2VzbyBhIGx1Z2FyZXMgcMO6YmxpY29zLCBlcyBkZWNpciBlbCBwZXJtaXNvIHBhcmEgbGEgYWRxdWlzaWNpw7NuIGRlIGJpZW5lcyB5IHNlcnZpY2lvcyBiw6FzaWNvcy4gTHVlZ28sIGNvbiB1bmEgYXByb2JhY2nDs24gbWVub3IgYSAwLjYgbGFzIHNhbGlkYXMgcG9yIGfDqW5lcm8uIEZpbmFsbWVudGUsIGxhIGFwcm9iYWNpw7NuIGRlbCBQYWRyw7NuIGRlIEhvZ2FyZXMgY29uIHVuYSBhcHJvYmFjacOzbiBkZSAwLjIgYXByb3hpbWFkYW1lbnRlLgoKIyBSZXNwb25kaWVuZG8gbGFzIHByZWd1bnRhcyBleHBsb3JhdG9yaWFzCgojIyDCv0V4aXN0ZSB1bmEgbWlzbWEgdGVuZGVuY2lhIGRlIHBvYmxhY2lvbmVzIGFmZWN0YWRhcyBwb3IgZWwgQ292aWQgMTkgZHVyYW50ZSBsYXMgbWVkaWRhcyBkZSBhaXNsYW1pZW50bz8KCkVsIGdyw6FmaWNvIDE3IG11ZXN0cmEgbGEgcmVsYWNpw7NuIGVudHJlIGxhcyB2YXJpYWJsZXMgY2xhc2Ugc29jaWFsIHkgZGlzdHJpdG8uIFVuYSBwYXJ0ZSBkZSBsYSBwb2JsYWNpw7NuIHNlIGRpc3RyaWJ1ecOzIGVudHJlIGxvcyBkaXN0cml0b3MgQmFycmFuY28gY29uIDMwMDAgYSA0MDAwIHNvbGVzIGRlIGluZ3Jlc29zIG1lbnN1YWxlcywgU2FudGlhZ28gZGUgU3VyY28gWzYwMDAtNzAwMCksIFN1cnF1aWxsbyBbNzAwMC04MDAwKSB5IFZpbGxhIE1hcsOtYSBkZWwgVHJpdW5mbyBbNTAwMC02MDAwKS4gTm8gb2JzdGFudGUsIGxhIG1heW9yIHBhcnRlIGRlIGxhIHBvYmxhY2nDs24gc2UgdWJpY2EgZW4gdW4gbml2ZWwgZGUgaW5ncmVzbyBlbnRyZSAwIGEgMjAwMC4gRW4gZWwgZ3LDoWZpY28gMTggc2UgbXVlc3RyYSBlbCBuw7ptZXJvIGRlIGNhc29zIHBvciBkaXN0cml0by4gRXN0b3MgcmVzdWx0YWRvcyBzZSBwdWVkZW4gdmluY3VsYXIgZGlyZWN0YW1lbnRlIGNvbiBsb3MgaW5ncmVzb3MgZGUgbGEgcG9ibGFjacOzbi4gRW4gZWwgZ3LDoWZpY28gMTcgYW5hbGl6YW1vcyBsb3MgZGlzdHJpdG9zIHF1ZSB0aWVuZW4gdW5hIG1heW9yIGRpc3RyaWJ1Y2nDs24gZW4gdW4gaW5ncmVzbyBlc3BlY8OtZmljby4gUG9yIGVqZW1wbG8sIGVuIGVsIGdyw6FmaWNvIDE4LiBlbCBkaXN0cml0byBkZSBCYXJyYW5jbyB0aWVuZSB1biBuw7ptZXJvIGRlIGNhc29zIG1lbm9yIGEgMjAwMCBtaWwgY2Fzb3MuIFN1cnF1aWxsbyBwb3Igc3UgcGFydGUgdGllbmUgYXByb3hpbWFkYW1lbnRlIDIxMDAgY2Fzb3MuIE3DoXMgYcO6biwgU2FudGlhZ28gZGUgU3VyY28gNTAwMCBjYXNvcyB5IFZpbGxhIE1hcsOtYSBkZWwgVHJpdW5mbyA1ODAwIGNhc29zLiBBIHBhcnRpciBkZSBlbGxvIHBvZHLDrWFtb3MgZXN0YWJsZWNlciBjaWVydG9zIHBhdHJvbmVzLiBFbCBwcmltZXJvIGRlIGVsbG9zIHNlcsOtYSBxdWUgcGFyYSBsYXMgcG9ibGFjaW9uZXMgZGUgdW4gZXN0YXR1cyBzb2NpYWwgc29sdmVudGUgKGluZ3Jlc29zIG1heW9yZXMgYSA0MDAwKSB5IHF1ZSBlc3RlIHNlYSBkZSB1biBkZXRlcm1pbmFkbyBkaXN0cml0byBwcmVzZW50YXLDoSB1biBtZW5vciBuw7ptZXJvIGRlIGNvbnRhZ2lhZG9zLiBFc3RvIHNlIGN1bXBsZSBwYXJhIEJhcnJhbmNvLCBTdXJxdWlsbG8geSBTYW50aWFnbyBkZSBTdXJjby4gTm8gb2JzdGFudGUsIHNpIG5vcyBkaXJpZ2ltb3MgYSBhbmFsaXphciBkZXRlcm1pbmFkYXMgcG9ibGFjaW9uZXMgZG9uZGUgZWwgbsO6bWVybyBkZSBpbmZlY3RhZG9zIGVzIGVsZXZhZG8geSBub3MgZmlqYW1vcyBlbiBlbCBpbmdyZXNvIHByb21lZGlvIHBvZGVtb3MgZGFyIGN1ZW50YSBxdWUgbGEgbWF5b3IgcGFydGUgb3NjaWxhIGVudHJlIGNlcm8gYSBtaWwgc29sZXMgbWVuc3VhbGVzLiBCYXN0YSBwYXJhIGlsdXN0cmFyLCBDb21hcywgZGlzdHJpdG8gcXVlIHRpZW5lIHVuIGluZ3Jlc28gZGUgY2VybyBhIG1pbCB5IGN1eW8gbsO6bWVybyBkZSBjYXNvcyBhc2NpZW5kZSBhIGNhc2kgOTAwMC4KCiMjIyBEaXN0cml0byB2cyBpbmdyZXNvCmBgYHtyLCBmaWcud2lkdGg9MTIsIGZpZy5oZWlnaHQ9MjB9CiMgTm8gc3VwZSBjb21vIGhhY2VybG8gY29uIHZhbmlsbGEgUgpnZ3Bsb3QoYWVzKHkgPSBkaXN0cml0bywgeCA9IGluZ3Jlc28pLCBkYXRhID0gZGZfZm9ybTIpICsKICAgIGdlb21fYm94cGxvdCgpICsKICAgIGdndGl0bGUoIkdyw6FmaWNvIDE3LiBEaXN0cml0b3MgdnMgaW5ncmVzb3MiKSArCiAgICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41KSkKYGBgCgojIyMgQ2Fzb3MgcG9yIGRpc3RyaXRvCmBgYHtyLCBmaWcud2lkdGg9MTIsIGZpZy5oZWlnaHQ9MjB9CnBhcihtYWkgPSBjKDEsIDIuNSwgMSwgMC41KSkKZGYgJT4lIGZpbHRlcihQUk9WSU5DSUEgPT0gIkxJTUEiKSAlPiUKICAgIHNlbGVjdChESVNUUklUTykgJT4lCiAgICB0YWJsZSgpICU+JQogICAgc29ydChUUlVFKSAlPiUKICAgIGJhcnBsb3QobGFzPTEsIGhvcml6PVRSVUUsIHhsYWI9IkNhc29zIikKdGl0bGUoIkdyw6FmaWNvIDE4LiBDYXNvcyBwb3IgZGlzdHJpdG8iKQpgYGAKCiMjIMK/TGFzIG1lZGlkYXMgZW4gbG9zIGRpc3RyaXRvcyBtw6FzIGV4Y2x1c2l2b3MgcHJlc2VudGFuIHVuYSBtYXlvciBvIG1lbm9yIGVmZWN0aXZpZGFkPwoKTGFzIG1lZGlkYXMgcHJlc2VudGFuIHVuYSBtYXlvciBlZmVjdGl2aWRhZCBlbiBlbCBkaXN0cml0byBkZSBCYXJyYW5jbywgZGFkbyBxdWUgYSBkaWZlcmVuY2lhIGRlIGxvcyBkZW3DoXMsIHN1IG7Dum1lcm8gb3NjaWxhIGVuIGFwcm94aW1hZGFtZW50ZSA5MDAgY2Fzb3MuIEVsIG1heW9yIG7Dum1lcm8gZGUgY2Fzb3MgZXMgZW4gU2FudGlhZ28gZGUgU3VyY28sIGNvbiBtw6FzIGRlIDQwMDAgbWlsIGNhc29zLiBBbmFsaXphbmRvLCBsYSBncsOhZmljYSAyMCwgbGEgY3VhbCByZWxhY2lvbmEgZW1wbGVvIFZTLiBEaXN0cml0byBzZSBwdWVkZSBjb25zdGF0YXIgcXVlIGVuIEJhcnJhbmNvIGV4aXN0ZSBtYXlvciBjYW50aWRhZCBkZSBnZW50ZSBjb24gdW4gZW1wbGVvIGluZm9ybWFsLiBDYWJlIHNlw7FhbGFyIHF1ZSB0YW1iacOpbiBoYXkgcG9ibGFjacOzbiBxdWUgbm8gdHJhYmFqYS4gUG9yIG90cm8gbGFkbywgZW4gU2FudGlhZ28gZGUgU3VyY28sIFNhbiBJc2lkcm8geSBTYW4gQm9yamEgZXhpc3RlIHVuYSBlbXBsZWFiaWxpZGFkIGZvcm1hbC4gVW4gcGF0csOzbiBtdXkgaW50ZXJlc2FudGUgZXMgcXVlIGxvcyBkaXN0cml0b3MgcXVlIHByZXNlbnRhbiB1bmEgZW1wbGVhYmlsaWRhZCBmb3JtYWwgdGllbmUgdW5hIG1heW9yIGNhbnRpZGFkIGRlIGluZ3Jlc29zLiBCYXN0YSBwYXJhIGlsdXN0cmFyLCBCYXJyYW5jbyB0aWVuZSB1biBpbmdyZXNvIGRlIGFscmVkZWRvciBkZSA0MDAwIHNvbGVzIGNvbiB1bmEgZW1wbGVhYmlsaWRhZCBpbmZvcm1hbCwgbWllbnRyYXMgcXVlIGxvcyB0cmVzIHJlc3RhbnRlcyB0aWVuZW4gdW4gaW5ncmVzbyBtYXlvciBhIDgwMDAgc29sZXMgY29uIHVuIHRpcG8gZGUgZW1wbGVvIGZvcm1hbC4KCiMjIyBEaXN0cml0byBleGNsdXNpdm9zIHZzIGNhc29zCmBgYHtyfQpwYXIobWFpID0gYygxLCAyLCAwLjIsIDAuNSkpCmRmICU+JSBmaWx0ZXIoUFJPVklOQ0lBID09ICJMSU1BIikgJT4lCiAgICBmaWx0ZXIoRElTVFJJVE8gJWluJSBjKCJNSVJBRkxPUkVTIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIkJBUlJBTkNPIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNBTiBJU0lEUk8iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAiU0FOVElBR08gREUgU1VSQ08iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAiU0FOIEJPUkpBIikKICAgICAgICAgICApIC0+IGluZmVjdGFkb3NfNSAjIEVzIG5lY2VzYXJpbyBsdWVnbwoKaW5mZWN0YWRvc181ICU+JQogICAgc2VsZWN0KERJU1RSSVRPKSAlPiUKICAgIHRhYmxlKCkgJT4lCiAgICBzb3J0KFRSVUUpICU+JQogICAgYmFycGxvdChsYXM9MSwgaG9yaXo9VFJVRSwgeGxhYj0iQ2Fzb3MiKQp0aXRsZSgiR3LDoWZpY28gMTkuIENhc29zIGVuIGFsZ3Vub3MgZGlzdHJpdG9zIikKYGBgCgojIyMgRGlzdHJpdG8gZXhjbHVzaXZvcyB2cyBlbXBsZW8KYGBge3J9CmRmX2Zvcm0yICU+JQogICAgZmlsdGVyKGRpc3RyaXRvICVpbiUgYygiTWlyYWZsb3JlcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJCYXJyYW5jbyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJTYW4gSXNpZHJvIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNhbnRpYWdvIGRlIFN1cmNvIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNhbiBCb3JqYSIpCiAgICAgICAgICAgKSAtPiBkZl81CmdncGxvdChhZXMoeSA9IGRpc3RyaXRvLCB4ID0gZW1wbGVvKSwgZGF0YSA9IGRmXzUpICsKICAgIGdlb21fYm94cGxvdCgpICsKICAgIGdndGl0bGUoIkdyw6FmaWNvIDIwLiBkaXN0cml0b3MgdnMgdGlwbyBkZSBlbXBsZW8iKQpgYGAKCiMjIyBEaXN0cml0byBleGNsdXNpdm8gdnMgaW5ncmVzbwpgYGB7cn0KZ2dwbG90KGFlcyh5ID0gZGlzdHJpdG8sIHggPSBpbmdyZXNvKSwgZGF0YSA9IGRmXzUpICsKICAgIGdlb21fYm94cGxvdCgpICsKICAgIGdndGl0bGUoIkdyw6FmaWNvIDIxLiBkaXN0cml0b3MgdnMgaW5ncmVzb3MiKSAjIEHDum4gbm8gaGEgcmVzcG9uZGlkbyBuYWRpZSBkZSBNaXJhZmxvcmVzLgpgYGAKCiMgUmVzcG9uZGllbmRvIGxhcyBwcmVndW50YXMgaW5mZXJlbmNpYWxlcwoKIyMgwr9MYSBlbnRyZWdhIGRlIG1heW9yZXMgc3Vic2lkaW9zIG1vbmV0YXJpb3MgcmVzdWx0YXLDrWEgZW4gdW4gaW1wb3J0YW50ZSBiZW5lZmljaW8gcGFyYSBsYSBkaXNtaW51Y2nDs24gZGVsIG7Dum1lcm8gZGUgc2FsaWRhcz8KCkEgcGFydGlyIGRlbCBncsOhZmljbyAyMiBzZSBtYW5pZmllc3RhIHF1ZSBlc3RhIG1lZGlkYSwgcGFyYSBsYSBwb2JsYWNpw7NuIGVuY3Vlc3RhZGEsIG5vIHJlZHVqbyBsYXMgc2FsaWRhcy4gRXN0byByZXNwYWxkYSBsYXMgaGlww7N0ZXNpcyBxdWUgc3VzY2l0YXJvbiBlbiBsYSBncsOhZmljYSA4IHkgOSwgbGFzIGN1YWxlcyBleHBvbsOtYW4gcXVlIGF1bnF1ZSBlbCBvYmpldGl2byBkZWwgcGFkcsOzbiBkZSBob2dhcmVzIGVyYSBheXVkYXIgYSBsYXMgcG9ibGFjaW9uZXMgbcOhcyB2dWxuZXJhYmxlcyBwYXJhIHF1ZSBwdWVkYW4gYWNjZWRlciBhIGxvcyBzZXJ2aWNpb3MgYsOhc2ljb3MsIGVsIG1pc21vIGhlY2hvIGRlIGNvYnJhciBoYWPDrWEgcXVlIGxhIHNhbGlkYXMgYXVtZW50ZW4uIERlbCBtaXNtbyBtb2RvLCBsYSBhZ2xvbWVyYWNpw7NuIHJlc3VsdGFyw61hIGVuIHVuIGF1bWVudG8gZGVsIG7Dum1lcm8gZGUgY29udGFnaWFkb3MsIGVsIGN1YWwgc2UgbXVlc3RyYSBjbGFyYW1lbnRlIGVuIGxhIGdyw6FmaWNhIDguCgojIyMgRW50cmVnYSBkZSBib25vIFMvLiAzODAsIFMvLjc2MCBkZSBhY3VlcmRvIGFsIFNpc3RlbWEgZGUgRm9jYWxpemFjacOzbiBkZSBIb2dhcmVzIChTSVNGT0gpCmBgYHtyfQpkZl9mb3JtMiRib25vLjA1ICU+JQogICAgdGFibGUoKSAlPiUKICAgIGJhcnBsb3QoeWxhYj0iUGVyc29uYXMiKQoKdGl0bGUoIkdyw6FmaWNvIDIyLiBSZWR1Y2Npw7NuIGRlIHNhbGlkYXMgKDAgLSA1KSIpCmBgYAoKIyMgRGlzbWludWNpw7NuIGRlIHNhbGlkYXMgZGUgbGFzIGRlbcOhcyBtZWRpZGFzCgojIyMgSW5tb3ZpbGl6YWNpw7NuCmBgYHtyfQpkZl9mb3JtMiRzb2NpYWwuMDUgJT4lCiAgICB0YWJsZSgpICU+JQogICAgYmFycGxvdCh5bGFiPSJQZXJzb25hcyIpCgp0aXRsZSgiRGUgMCBhIDUsIMK/Q8O6YW50byBkaXNtaW51eWVyb24gdHVzIHNhbGlkYXMgZHVyYW50ZSBsYSBjdWFyZW50ZW5hPyIpCmBgYAoKIyMjIFN1c3BlbnNpw7NuIGRlIGFjY2VzbyBhIGx1Z2FyZXMgcMO6YmxpY29zCmBgYHtyfQpkZl9mb3JtMiRvY2lvLjA1ICU+JQogICAgdGFibGUoKSAlPiUKICAgIGJhcnBsb3QoeWxhYj0iUGVyc29uYXMiKQoKdGl0bGUoIkRlIDAgYSA1LCDCv0PDumFudG8gZGlzbWludXllcm9uIHR1cyBzYWxpZGFzIGR1cmFudGUgbGEgY3VhcmVudGVuYT8iKQpgYGAKCiMjIyBEaXNwb3NpY2nDs24gc2FsaWRhIGRlIGhvbWJyZXMgeSBtdWplcmVzIGVuIGTDrWFzIGNvbXBsZW1lbnRhcmlvcwpgYGB7cn0KZGZfZm9ybTIkbm9kYXkuMDUgJT4lCiAgICB0YWJsZSgpICU+JQogICAgYmFycGxvdCh5bGFiPSJQZXJzb25hcyIpCgp0aXRsZSgiRGVsIDAgYWwgNSwgwr9DdcOhbnRvIGNhbWJpw7MgdHVzIHNhbGlkYXM/IikKYGBgCgojIFJlc3BvbmRpZW5kbyBsYXMgcHJlZ3VudGFzIHByZWRpY3RpdmFzCgojIyDCv0VzIHBvc2libGUgcHJlZGVjaXIgY3XDoW50YXMgaG9yYXMgZW4gcHJvbWVkaW8gdW5hIHBlcnNvbmEgc2Fsw61hIGRlIGNhc2EgY29ub2NpZW5kbyBzdSBuaXZlbCBkZSBpbmdyZXNvcyB5IGVsIGRpc3RyaXRvIGRlIHJlc2lkZW5jaWE/CgpQYXJhIGVzdGEgcHJlZ3VudGEsIHV0aWxpemFyZW1vcyBsYSBncsOhZmljYSAxNyBwYXJhIHRyYXRhciBkZSBkYXJsZSByZXNwdWVzdGEuIENvbW8geWEgc2UgYW5hbGl6w7MgcHJldmlhbWVudGUsIGVzdGEgZ3LDoWZpY2EgZXhoaWJlIHF1ZSB0cmVzIGRlIGxvcyBjaW5jb3MgZGlzdHJpdG9zIGV4Y2x1c2l2b3MgZGUgTGltYSB0aWVuZW4gdW4gaW5ncmVzbyBlbnRyZSAzMDAwIHkgODAwMCBzb2xlcy4gU2luIGVtYmFyZ28gZW4gZGlzdHJpdG9zIGNvbW8gQXRlIFZpdGFydGUsIENpZW5lZ3VpbGxhLCBFbCBBdWd1c3Rpbm8sIEluZGVwZW5kZW5jaWEsIEx1csOtbiwgZW50cmUgb3Ryb3MsIGVsIG5pdmVsIGRlIGluZ3Jlc29zIGVzIGRlc2RlIDEwMDAgYSAyMDAwIHNvbGVzLiBFbiBiYXNlIGEgZXN0b3MgZGF0b3MsIHBvZHLDrWFtb3MgcHJlZGVjaXIgcXVlIGxhcyBwZXJzb25hcyBjb24gbWF5b3JlcyBpbmdyZXNvcyBzb24gbGFzIHF1ZSBtZW5vcyBob3JhcyBzYWxlbiBkZSBjYXNhLCBtaWVudHJhcyBxdWUgbGFzIHBlcnNvbmFzIHF1ZSBubyB0aWVuZW4gdW5hIGJ1ZW5hIHNvbHZlbmNpYSBlY29uw7NtaWNhIHJlcXVlcmlyw61hbiB5IHNlIHZlcsOtYW4gZW4gbGEgb2JsaWdhY2nDs24gZGUgc2FsaXIgZGUgY2FzYSBwYXJhIHBvZGVyIGNvbnNlZ3VpciBkaW5lcm8sIHlhIHNlYSB2ZW5kaWVuZG8gcHJvZHVjdG9zIGRlIHByaW1lcmEgbmVjZXNpZGFkLCByb3BhLCBhY2Nlc29yaW9zLCBldGMuCgojIyDCv0VzIHBvc2libGUgcHJlZGVjaXIgc3Ugbml2ZWwgZGUgaW5ncmVzb3MgY29ub2NpZW5kbyDDum5pY2FtZW50ZSBzdSB0aXBvIGRlIGVtcGxlbz8KCkRlc3B1w6lzIGRlIHJlYWxpemFyIHVuYSBpbnZlc3RpZ2FjacOzbiwgc2UgcHVkbyBlbmNvbnRyYXIgcXVlIGxhcyBwZXJzb25hcyBjb24gdW4gZW1wbGVvIGluZm9ybWFsIGdhbmFuIGVuIHByb21lZGlvIFMvLiA3MTUuIExhIG1pbmlzdHJhIGRlIFRyYWJham8sIFN5bHZpYSBDw6FjZXJlcyBtZW5jaW9uw7MgcXVlIGVuIGNvbnRyYXN0ZSBjb24gbGEgcG9ibGFjacOzbiBlbiBlbCBzZWN0b3IgZm9ybWFsIHBlcmNpYmVuIHVuIHNhbGFyaW8gcHJvbWVkaW8gZGUgbcOhcyBkZSBTLy4gMjAwMC4gRXMgbmVjZXNhcmlvIGRlc3RhY2FyIHF1ZSBsYSB2YXJpYWJpbGlkYWQgZGVwZW5kZXLDoSBkZWwgdGlwbyBkZSB0cmFiYWpvLiBUYW1iacOpbiBsYSBtaW5pc3RyYSBtZW5jaW9uw7MgcXVlIGxhIGJyZWNoYSBlcyBkZSB1biA2NCUuIFBhcmEgZWwgZ3LDoWZpY28gMTgsIHVuYSBtYXlvciBwb2JsYWNpw7NuIHNlIGVuY3VlbnRyYSB0cmFiYWphbmRvIGVuIHVuIHNlY3RvciBmb3JtYWwsIHBvciBsbyBxdWUgc3VzIGluZ3Jlc29zIG9zY2lsYXLDrWFuIGVudHJlIFMvLjIwMDAgYSBtw6FzLiBQb3Igb3RybyBsYWRvLCBlbCBzZWN0b3IgaW5mb3JtYWwgZXMgZWwgcXVlIG1lbm9zIHBvYmxhY2nDs24gcHJlc2VudGEsIG1lbm9yIGEgcXVpbmNlIHBlcnNvbmFzIGFwcm94aW1hZGFtZW50ZS4gRXN0YSBwb2JsYWNpw7NuLCBzZWfDum4gbG8gY2l0YWRvLCB0ZW5kcsOhIHVuIHNhbGFyaW8gdHJlcyB2ZWNlcyBtZW5vciBhbCBkZWwgc2VjdG9yIGZvcm1hbC4KCiMjIyBFbXBsZW8KYGBge3J9CnBhcihtYWkgPSBjKDEsIDEuNSwgMC41LCAwLjUpKQpkZl9mb3JtMiRlbXBsZW8gJT4lCiAgICB0YWJsZSgpICU+JQogICAgc29ydChUUlVFKSAlPiUKICAgIGJhcnBsb3QoaG9yaXogPSBUUlVFLCBsYXMgPSAyLCB4bGFiID0gIlBlcnNvbmFzIiwgeWxhYj0iIikKCnRpdGxlKCJHcsOhZmljbyAyMy4gVGlwbyBkZSB0cmFiYWpvIikKYGBgCgojIFJlc3BvbmRpZW5kbyBsYXMgcHJlZ3VudGFzIGNhdXNhbGVzCgojIyDCv1F1w6kgZmFjdG9yZXMgZGV0ZXJtaW5hbiBxdWUgbGEgcHJvcGFnYWNpw7NuIGRlbCBDb3ZpZCAxOSBzZSBkZXNhY2VsZXJlPwoKIyMjIERlc2FjZWxlcmFjacOzbiBkZWwgY29udGFnaW8KYGBge3J9CmRmX2Zvcm0yJGRlY2NlbGVyYXRpb24gJT4lCiAgICB1bmxpc3QoKSAlPiUKICAgIHRhYmxlKCkgJT4lCiAgICBzb3J0KFRSVUUpICU+JQogICAga25pdHI6OmthYmxlKGNvbC5uYW1lcyA9IGMoIk1lZGlkYSIsICJQZXJzb25hcyBxdWUgbG8gYXBydWViYW4iKSkKYGBgCgojIFJlc3BvbmRpZW5kbyBsYXMgcHJlZ3VudGFzIG1lY2Fuw61zdGljYXMKCiMjIMK/Q8OzbW8gY2llcnRhcyBjb25kaWNpb25lcyBkZXRlcm1pbmFuIHF1ZSBsYSBwcm9wYWdhY2nDs24gZGVsIENPVklEIHNlIGFjZWxlcmU/CgojIyMgQWNlbGVyYWNpw7NuIGRlbCBjb250YWdpbwpgYGB7cn0KZGZfZm9ybTIkYWNjZWxlcmF0aW9uICU+JQogICAgdW5saXN0KCkgJT4lCiAgICB0YWJsZSgpICU+JQogICAgc29ydChUUlVFKSAlPiUKICAgIGtuaXRyOjprYWJsZShjb2wubmFtZXMgPSBjKCJGYWN0b3IiLCAiUGVyc29uYXMgcXVlIGxvIGFwcnVlYmFuIikpCmBgYAoKIyBEaXNjdXNpw7NuIGRlIHJlc3VsdGFkb3MKCiMjIFBhdHJvbmVzOgoKMS4gUHVkaW1vcyBub3RhciBxdWUgbGEgY3VydmEgZGUgY2Fzb3MgdG90YWxlcyBtdWVzdHJhIHVuIGNyZWNpbWllbnRvIGNvbnRpbnVvIGVuIGVsIHRpZW1wbywgZXZpZGVuY2nDoW5kb3NlIHVuIGNhbWJpbyBubyBzaWduaWZpY2F0aXZvIGVudHJlIGFudGVzIHkgZGVzcHXDqXMgZGUgaGFiZXIgdG9tYWRvIGNhZGEgbWVkaWRhLgoKMi4gRW4gY3VhbnRvIGEgbG9zIG51ZXZvcyBjYXNvcyBwb3IgZMOtYSBwdWRpbW9zIG5vdGFyIHF1ZSB0b2RhcyBsYXMgZ3LDoWZpY2FzIG11ZXN0cmFuIHVuYSB2YXJpYWNpw7NuIGNvbnNpZGVyYWJsZSBlbiBsYSBjYW50aWRhZCBkZSBjYXNvcyBkaWFyaW9zIHBvY29zIGTDrWFzIGRlc3B1w6lzIGRlIHF1ZSBzZSBhcGxpY2FyYSBjYWRhIG1lZGlkYS4gRXN0YXMgdmFyaWFjaW9uZXMgc2UgdmVuIGNvbW8gZGF0b3MgYXTDrXBpY29zIGVuIGxhcyBncsOhZmljYXMuCgozLiBFbiBsYXMgZ3LDoWZpY2FzIGRlIG1vdmlsaXphY2nDs24gc29jaWFsIHNpIHNlIHB1ZWRlIHZlciBjbGFyYW1lbnRlIGVsIGVmZWN0byBkZSBsYXMgbWVkaWRhcyByZXNwZWN0aXZhcyBlbiBlbGxhcy4gRWwgZXN0YWRvIGRlIGVtZXJnZW5jaWEgaGl6byBxdWUgbGEgbW92aWxpemFjacOzbiBzb2NpYWwgZGlzbWludXllcmEgZW4gZ3JhbiBtZWRpZGEgeSBsYSBub3JtYSBkZSBzYWxpciBkw61hcyBlc3BlY8OtZmljb3MgZGUgbGEgc2VtYW5hIHRhbWJpw6luIHR1dm8gdW4gaW1wYWN0byBlbiBsYSBtb3ZpbGl6YWNpw7NuIGNpZXJ0b3MgZMOtYXMgZGUgbGEgc2VtYW5hLgoKNC4gQXNpbWlzbW8sIG90cm8gcGF0csOzbiBlbmNvbnRyYWRvIGVzIHF1ZSBwYXJhIGxhcyBwb2JsYWNpb25lcyBkZSB1biBlc3RhdHVzIHNvY2lhbCBzb2x2ZW50ZSAoaW5ncmVzb3MgbWF5b3JlcyBhIDQwMDApIHkgZXN0ZSBzaWVuZG8gZGUgdW4gZGV0ZXJtaW5hZG8gZGlzdHJpdG8gcHJlc2VudGEgdW4gbWVub3IgbsO6bWVybyBkZSBjb250YWdpYWRvcy4gRXN0byBzZSBjdW1wbGUgcGFyYSBCYXJyYW5jbywgU3VycXVpbGxvIHkgU2FudGlhZ28gZGUgU3VyY28uIE5vIG9ic3RhbnRlLCBzaSBub3MgZGlyaWdpbW9zIGEgYW5hbGl6YXIgZGV0ZXJtaW5hZGFzIHBvYmxhY2lvbmVzIGRvbmRlIGVsIG7Dum1lcm8gZGUgaW5mZWN0YWRvcyBlcyBlbGV2YWRvIHkgbm9zIGZpamFtb3MgZW4gZWwgaW5ncmVzbyBwcm9tZWRpbyBwb2RlbW9zIGRhciBjdWVudGEgcXVlIGxhIG1heW9yIHBhcnRlIG9zY2lsYSBlbnRyZSBjZXJvIGEgbWlsIHNvbGVzIG1lbnN1YWxlcy4gQmFzdGEgcGFyYSBpbHVzdHJhciwgQ29tYXMsIGRpc3RyaXRvIHF1ZSB0aWVuZSB1biBpbmdyZXNvIGRlIGNlcm8gYSBtaWwgeSBjdXlvIG7Dum1lcm8gZGUgY2Fzb3MgYXNjaWVuZGUgYSBjYXNpIDkwMDAuCgo1LiBVbiBwYXRyw7NuIG11eSBpbnRlcmVzYW50ZSBlcyBxdWUgbG9zIGRpc3RyaXRvcyBxdWUgcHJlc2VudGFuIHVuYSBlbXBsZWFiaWxpZGFkIGZvcm1hbCB0aWVuZSB1bmEgbWF5b3IgY2FudGlkYWQgZGUgaW5ncmVzb3MuIEJhc3RhIHBhcmEgaWx1c3RyYXIsIEJhcnJhbmNvIHRpZW5lIHVuIGluZ3Jlc28gZGUgYWxyZWRlZG9yIGRlIDQwMDAgc29sZXMgY29uIHVuYSBlbXBsZWFiaWxpZGFkIGluZm9ybWFsLCBtaWVudHJhcyBxdWUgbG9zIHRyZXMgcmVzdGFudGVzIHRpZW5lbiB1biBpbmdyZXNvIG1heW9yIGEgODAwMCBzb2xlcyBjb24gdW4gdGlwbyBkZSBlbXBsZW8gZm9ybWFsLgoKNi4gU2Ugb2JzZXJ2w7MgcXVlIGxhIG1heW9yw61hIGRlIHZlY2VzLCBsb3MgIGluZ3Jlc29zIG1lbnN1YWxlcyBtw6FzIGFsdG9zIGZhdm9yZWPDrWFuIGEgbWVub3JlcyBmcmVjdWVuY2lhcyBkZSBzYWxpZGEgcXVlIGxhIG1lZGlhbmEgZW4gc2FsaWRhcyBkZWwgcmFuZ28gbcOhcyBiYWpvIGRlIGluZ3Jlc29zLgoKNy4gU2Ugb2JzZXJ2w7MgcXVlIGxhIG1lZGlhbmEgZGUgbGFzIGVkYWRlcyBubyBjYW1iacOzIG11Y2hvIGEgbWVkaWRhIHF1ZSBhdW1lbnRhYmFuIGxhcyBmcmVjdWVuY2lhcyBkZSBzYWxpZGEuIExhcyBkaXN0cmlidWNpb25lcyBkZSBsYXMgZWRhZGVzIHBhcmEgY2FkYSBmcmVjdWVuY2lhIGRlIHNhbGlkYSBubyByZXN1bHRhcm9uIG11eSBkaWZlcmVudGVzLiBTaW4gZW1iYXJnbywgcGFyZWPDrWEgcXVlIHBlcnNvbmFzIGNvbiBtZW5vciBlZGFkIGEgMjUgYcOxb3MgdGVuw61hbiBtZW5vcmVzIGZyZWN1ZW5jaWFzIGRlIHNhbGlkYS4KCjguIFNlIG9ic2VydsOzIHF1ZSBsYSBjYW50aWRhZCBkZSBvYnNlcnZhY2lvbmVzIHBvciBnw6luZXJvLCB0aXBvIGRlIHRyYWJham8gcmVzdWx0YW4gZGlzcGVyc2FzIHBhcmEgY2FkYSBhdW1lbnRvIGVuIGxhIGZyZWN1ZW5jaWEgZGUgc2FsaWRhLiBTaW4gZW1iYXJnbywgbG9zIGhvbWJyZXMgcGFyZWPDrWFuIHNlciBmYXZvcmVjaWRvcyBhIHRlbmVyIHVuYSBtYXlvciBpbmNpZGVuY2lhIGVuIGxhIGZyZWN1ZW5jaWEgZGUgc2FsaWRhLCBubyBzZSBtdWVzdHJhIHVuIGNvbXBvcnRhbWllbnRvIGRlZmluaWRvLgoKIyBIaXDDs3Rlc2lzLCByZWxhY2nDs24gbW92aWxpZGFkIHNvY2lhbC0+IGNhc29zIGNvdmlkLTE5OgoKKiAxKSBIMDogTWF5b3JlcyBjYXNvcyBkdXJhbnRlIGxhIG1lZGlkYSBkZSBpbm1vdmlsaXphY2nDs24gc29jaWFsIG5vIGltcGxpY2EgbmVjZXNhcmlhbWVudGUgdW4gYXVtZW50byBkZSBsYSBtb3ZpbGl6YWNpw7NuIHNvY2lhbC4KSDE6IE1heW9yZXMgY2Fzb3MgZHVyYW50ZSBsYSBtZWRpZGEgZGUgaW5tb3ZpbGl6YWNpw7NuIHNvY2lhbCBzdXBvbmUgdW4gYXVtZW50byBkZSBsYSBjYW50aWRhZCBkZSBwZXJzb25hcyBxdWUgc2UgbW92aWxpemFuCgoqIDIpIEgwOiBNZW5vcmVzIG1vdmlsaXphY2lvbmVzIGR1cmFudGUgbGEgbWVkaWRhIEFwcm9iYWNpw7NuIGRlbCBQYWRyw7NuIGRlIEhvZ2FyZXMgZ2VuZXLDsyBtw6FzIGluZmVjdGFkb3MKSDE6IE1heW9yZXMgbW92aWxpemFjaW9uZXMgZHVyYW50ZSBsYSBtZWRpZGEgQXByb2JhY2nDs24gZGVsIFBhZHLDs24gZGUgSG9nYXJlcyBnZW5lcsOzIG3DoXMgaW5mZWN0YWRvcwoKIyMgSGlww7N0ZXNpcywgZW4gcmVsYWNpw7NuIGEgbGFzIGVuY3Vlc3RhczoKCiogMSkgIEgwOiBMYXMgcGVyc29uYXMgY29uIG1lbm9yZXMgZnJlY3VlbmNpYXMgZGUgc2FsaWRhIG5vIG5lY2VzYXJpYW1lbnRlIHRpZW5lbiBpbmdyZXNvcyAgICAgICAgICAgICBtZW5zdWFsZXMgbWF5b3JlcyBhIDEwMDAgc29sZXMuCiAgICAgIEhJOkxhcyBwZXJzb25hcyBjb24gbWVub3JlcyBmcmVjdWVuY2lhcyBkZSBzYWxpZGEgdGllbmVuIGluZ3Jlc29zIG1lbnN1YWxlcyBtYXlvcmVzIHF1ZSAgICAgICAgICAxMDAwIHNvbGVzLgoKKiAyKSBIMDogbGFzIHBlcnNvbmFzIGNvbiBtZW5vciBlZGFkIGRlIDI1IGHDsW9zIG5vIG5lY2VzYXJpYW1lbnRlIHRpZW5lbiBtZW5vcmVzIGZyZWN1ZW5jaWFzIGRlICAgICAgIHNhbGlkYQogICAgIEhJOiBsYXMgcGVyc29uYXMgY29uIG1lbm9yIGVkYWQgZGUgMjUgYcOxb3MgdGllbmVuIG1lbm9yZXMgZnJlY3VlbmNpYXMgZGUgc2FsaWRhCgoqIDMpIEgwOiBsYXMgcGVyc29uYXMgZGUgZ2VuZXJvIG1hc2N1bGlubyBubyBuZWNlc2FyaWFtZW50ZSB0aWVuZW4gbWF5b3JlcyBmcmVjdWVuY2lhcyBkZSBzYWxpZGEKICAgICBISTogbGFzIHBlcnNvYW5hcyBkZSBnZW5lcm8gbWFzdWN1bGlubyB0aWVuZW4gbWF5b3JlcyBmcmVjdWVuY2lhcyBkZSBzYWxpZGEKCiMjIFBhcsOhbWV0cm9zIGRlIGVzdHVkaW8KQSBwYXJ0aXIgZGUgbG9zIGRhdG9zIG9idGVuaWRvcyBkZSBsYXMgZW5jdWVzdGEsIHNlIGVzdGFibGVjZW4gcGFyw6FtZXRyb3MgZGUgaW50ZXLDqXMgcXVlIHBlcm1pdGVuIGN1YW50aWZpY2FyIGxhIGNvbmZpYWJpbGlkYWQgZGVsIGVzdHVkaW8gcmVhbGl6YWRvOgoKfFBvYmxhY2nDs24gfCBUYW1hw7FvIGRlIGxhIG11ZXN0cmEgIChwZXJzb25hcyBlbnRyZXZpc3RhZGFzKSB8IFNpZ25pZmljYW5jaWEgKM6xKSB8IE5pdmVsIGRlIGNvbmZpYW56YSAoMS3OsSkgfAp8LS0tfC0tLS0tLS0tLS18LS0tLS0tfAp8IDgwMDAwMDAgfDM2MHwgNSV8IDk1JXwKCiNJbnRlcnZhbG9zIGRlIGNvbmZpYW56YSBwYXJhIGxhIG1lZGlhIGRlIHZhcmlhYmxlcyBjdWFudGl0YXRpdmFzIGRlIGVuY3Vlc3RhCgpgYGB7cn0KIyBJbnRlcnZhbG9zIGRlIGNvbmZpYW56YSBwYXJhIGxhIG1lZGlhIGRlIGxhIHZhcmlhYmxlIEZyZWN1ZW5jaWFfc2FsaWRhX3Bvcl9TZW1hbmEKbj1sZW5ndGgoZGZfZm9ybTIkc2FsaWRhc18pCnluPW1lYW4oZGZfZm9ybTIkc2FsaWRhc18pCgplc249c2QoZGZfZm9ybTIkc2FsaWRhc18pL3NxcnQobikKYWxmYT0wLjA1CnBhcmFtZXRyb19lc3RhZGlzdGljbz1xbm9ybShhbGZhLzIsbG93ZXIudGFpbCA9IEZBTFNFKQpsaW1faW5mZXJpb3I9eW4tcGFyYW1ldHJvX2VzdGFkaXN0aWNvKmVzbgpsaW1fc3VwZXJpb3I9eW4rcGFyYW1ldHJvX2VzdGFkaXN0aWNvKmVzbgpyb3VuZChsaW1fc3VwZXJpb3IsMikKcm91bmQobGltX2luZmVyaW9yLDIpCgpyb3VuZChwYXJhbWV0cm9fZXN0YWRpc3RpY28qZXNuLDIpCmBgYAokJCBsLnN1cGVyaW9yICwgbC5pbmZlcmlvcj15bigrLy0pIHBhcmFtZXRyby5lc3RhZGlzdGljbyplc24kJAokJCBsLnN1cGVyaW9yPSAyLjY3LCBsLmluZmVyaW9yPTIuMzIkJAoKYGBge3J9CiMgSW50ZXJ2YWxvcyBkZSBjb25maWFuemEgcGFyYSBsYSBtZWRpYSBkZSBsYSB2YXJpYWJsZSBlZGFkCm49bGVuZ3RoKGRmX2Zvcm0yJGVkYWQpCmFsZmE9MC4wNQp5bjI9bWVhbihkZl9mb3JtMiRlZGFkKQplc24yPXNkKGRmX2Zvcm0yJGVkYWQpL3NxcnQobikKcGFyYW1ldHJvX2VzdGFkaXN0aWNvMj1xbm9ybShhbGZhLzIsbG93ZXIudGFpbCA9IEZBTFNFKQpsaW1faW5mZXJpb3I9eW4yLXBhcmFtZXRyb19lc3RhZGlzdGljbzIqZXNuMgpsaW1fc3VwZXJpb3I9eW4yK3BhcmFtZXRyb19lc3RhZGlzdGljbzIqZXNuMgpyb3VuZChsaW1fc3VwZXJpb3IsMikKcm91bmQobGltX2luZmVyaW9yLDIpCnJvdW5kKHBhcmFtZXRyb19lc3RhZGlzdGljbzIqZXNuMiwyKQoKYGBgCgokJCBsLnN1cGVyaW9yICwgbC5pbmZlcmlvcj15bjIoKy8tKSBwYXJhbWV0cm8uZXN0YWRpc3RpY28yKmVzbjIkJAokJCBsLnN1cGVyaW9yPSAzNC43NywgbC5pbmZlcmlvcj0zMi4wMyQkCgoKYGBge3J9CigxMDAwICogKGFzLm51bWVyaWMoZGZfZm9ybTIkaW5ncmVzbykgLSAxKSkgLT4gaW5ncmVzb3MKCiMgSW50ZXJ2YWxvcyBkZSBjb25maWFuemEgcGFyYSBsYSBtZWRpYSBkZSBsYSB2YXJpYWJsZSBpbmdyZXNvCm49bGVuZ3RoKGRmX2Zvcm0yJGluZ3Jlc28pCmFsZmE9MC4wNQp5bjM9bWVhbihpbmdyZXNvcykKZXNuMz1zZChpbmdyZXNvcykvc3FydChuKQpwYXJhbWV0cm9fZXN0YWRpc3RpY28zPXFub3JtKGFsZmEvMixsb3dlci50YWlsID0gRkFMU0UpCmxpbV9pbmZlcmlvcj15bjMtcGFyYW1ldHJvX2VzdGFkaXN0aWNvMyplc24zCmxpbV9zdXBlcmlvcj15bjMrcGFyYW1ldHJvX2VzdGFkaXN0aWNvMyplc24zCnJvdW5kKGxpbV9zdXBlcmlvciwyKQpyb3VuZChsaW1faW5mZXJpb3IsMikKcm91bmQocGFyYW1ldHJvX2VzdGFkaXN0aWNvMyplc24zLDIpCmBgYAokJCBsLnN1cGVyaW9yICwgbC5pbmZlcmlvcj15bjMoKy8tKSBwYXJhbWV0cm8uZXN0YWRpc3RpY28zKmVzbjMkJAokJCBsLnN1cGVyaW9yPSAyNjc0LjQ1LCBsLmluZmVyaW9yPTIwNjQuNDQkJAoKCiMgVmFsb3JlcyBkZSBpbnRlcsOpcwoKfFZhcmlhYmxlcyBjdWFudGl0YXRpdmFzIHwgUmFuZ28gfCBNZWRpYSB8IEludGVydmFsbyBkZSBjb25maWFuemEgfAp8LS0tfC0tLS0tLS0tLS18LS0tLS0tfAp8IEVkYWQgfFsxNyw2N10gfCAzOS44fCB1IMKxIDEuMzd8CnwgRnJlY3VlbmNpYSBkZSBzYWxpZGEgcG9yIHNlbWFuYSB8WzAsNl0gICB8IDIuNXwgdSDCsSAwLjE3fAp8IEluZ3Jlc298IFswLDkwMDBdfCAyMzY5fCB1IMKxIDMwNS4wMXwKCkNvbm9jZXIgbG9zIGludGVydmFsb3MgZGUgY29uZmlhbnphICBwYXJhIGxhIG1lZGlhIGRlIGxhIGVkYWQsIHBlcm1pdGUgc2FiZXIgIGNvbiB1bmEgY29uZmlhbnphIGRlbCA5NSUgcXXDqSB0YW4gY2VyY2EgZXN0w6FuIGxhcyBlZGFkZXMgZW4gcHJvbWVkaW8gY29uIGVsIHZhbG9yIGVzcGVyYWRvIGRlIGxhIGRpc3RyaWJ1Y2nDs24gbm9ybWFsLiAgRXN0byBzaWduaWZpY2EgcXVlIGVsIGludGVydmFsbyBkZSBlZGFkZXMgZW4gbGEgbXVlc3RyYSwgZW50cmUgMzgtNDAgYcOxb3MgcmVwcmVzZW50YW4gZWwgOTUlIGRlIGNvbmZpYW56YSBwYXJhIGxhIG1lZGlhLgpSZXNwZWN0byBhIGxhIGZyZWN1ZW5jaWEgZGUgc2FsaWRhLCB5YSBxdWUgZWwgaW50ZXJ2YWxvIGRlIGNvbmZpYW56YSBkZSBsYSBtZWRpYSBlcyBtdXkgcGVxdWXDsW8gaW5kaWNhIHF1ZSBkdXJhbnRlIGNhZGEgdW5hIGRlIGxhcyBtZWRpZGFzIGFwbGljYWRhcyBsYSBtYXlvcsOtYSBkZSBwZXJzb25hcyBlbnRyZXZpc3RhZGFzIHNhbGllcm9uIDIgdmVjZXMgYSBsYSBzZW1hbmEuCgoKIyBQcnVlYmFzIGRlIEhpcMOzdGVzaXM6CiMjIEhpcMOzdGVzaXMsIGVuIHJlbGFjacOzbiBhIGxhcyBlbmN1ZXN0YXM6CiogMSkgIEgwOiBMYXMgcGVyc29uYXMgY29uIG1lbm9yZXMgZnJlY3VlbmNpYXMgZGUgc2FsaWRhIG5vIG5lY2VzYXJpYW1lbnRlIHRpZW5lbiBpbmdyZXNvcyAgICAgICAgICAgICBtZW5zdWFsZXMgbWF5b3JlcyBhIDEwMDAgc29sZXMuCiAgICAgIEhJOkxhcyBwZXJzb25hcyBjb24gbWVub3JlcyBmcmVjdWVuY2lhcyBkZSBzYWxpZGEgdGllbmVuIGluZ3Jlc29zIG1lbnN1YWxlcyBtYXlvcmVzIHF1ZSAgICAgICAgICAxMDAwIHNvbGVzLgoKClBhcmEgZGV0ZXJtaW5hciBjw7phbCBoaXDDs3Rlc2lzIGNvcnJlc3BvbmRlIGEgbGEgY29uZmlhbnphIHkgdG9sZXJhbmNpYSBxdWUgZXNwZXJhbW9zIG9idGVuZXIsIGRldGVybWluYW1vcyBsYXMgcGVyc29uYXMgcXVlIHRpZW5lbiB1biBpbmdyZXNvIG1heW9yIGEgMTAwMCBzb2xlcy4KYGBge3J9CnN1bW1hcnkoZGZfZm9ybTIkZWRhZCkKCnN1bW1hcnkoZGZfZm9ybTIkc2FsaWRhc18pCmBgYAoKYGBge3J9CiNQcnVlYmEgZGUgaGlwb3Rlc2lzIGVuY3Vlc3RhCgpkZl9mb3JtMiAlPiVmaWx0ZXIoaW5ncmVzbz09IlswLTEwMDApIikgJT4lIGdyb3VwX2J5KGluZ3Jlc28pICU+JQogICAgc3VtbWFyaXNlKG1lYW4gPSBtZWFuKHNhbGlkYXNfLCBuYS5ybSA9IFRSVUUpKSAlPiUKICAgIHN1bW1hcmlzZShtZWFuID0gbWVhbihtZWFuKSkgJT4lCiAgICBhcy5udW1lcmljKCkgLT4gcHJvbWVkaW9fbWF5b3IKCgojdC50ZXN0KGRmX2Zvcm0yJHNhbGlkYXNfLG11PXByb21lZGlvX3RvdGFsLGFsdGVybmF0aXZlID0gImdyZWF0ZXIiLGNvbmYubGV2ZWw9MC45NSkKcHJvbWVkaW9fbWF5b3IKCmBgYAoKYGBge3J9Cm49bGVuZ3RoKGRmX2Zvcm0yJHNhbGlkYXNfKQp4YmFycmE9bWVhbihkZl9mb3JtMiRzYWxpZGFzXykKZGVzdl9lc3RhbmRhcm11ZXN0cmE9c2QoZGZfZm9ybTIkc2FsaWRhc18pCmRlc3ZiYXJyYT1kZXN2X2VzdGFuZGFybXVlc3RyYS9zcXJ0KG4pICMgZGVzdmlhY2lvbiBlc3RhbmRhciBkZSBwb2JsYWNpb24Kbml2ZWxfY29uZmlhbnphPTAuOTUKbXVfZXZhbHVhcj1wcm9tZWRpb19tYXlvcgp6X29ic2VydmFkbz0oeGJhcnJhLW11X2V2YWx1YXIpL2Rlc3ZiYXJyYSAjIGVzdGFkw61zdGljbyBkZSBwcnVlYmEKcF92YWxvcj1wbm9ybSh6X29ic2VydmFkbykgICMgY29sYSBpenF1aWVyZGEKCnBfc2lnbmlmaWNhbmNpYT0xLW5pdmVsX2NvbmZpYW56YQoKcF92YWxvcgoKcF9zaWduaWZpY2FuY2lhCmBgYAoKRGUgYWN1ZXJkbyBhIGxvIGNhbGN1bGFkbyBlbCBwLXZhbG9yIGVzIG1lbm9yIGEgbGEgc2lnbmlmaWNhbmNpYSAwLjA1IGVzcGVjaWZpY2FkYS4gUG9yIGxvIHF1ZSAgc2UgcmVjaGF6YSBIMCAsIHVuYSBtZW5vciBmcmVjdWVuY2lhIGRlIHNhbGlkYSAgZXMgaW5mbHVlbmNpYWRhIHBvciB0ZW5lciAgaW5ncmVzbyBtYXlvciBhIDEwMDAgc29sZXMuCgoqIDIpIEgwOiBsYXMgcGVyc29uYXMgY29uIG1lbm9zIGVkYWQgZGUgMjUgYcOxb3Mgbm8gbmVjZXNhcmlhbWVudGUgdGllbmVuIG1lbm9yZXMgZnJlY3VlbmNpYXMgZGUgc2FsaWRhCiAgICAgSEk6IGxhcyBwZXJzb25hcyBjb24gbWVub3MgZWRhZCBkZSAyNSBhw7FvcyB0aWVuZW4gbWVub3JlcyBmcmVjdWVuY2lhcyBkZSBzYWxpZGEKClNlIGRldGVybWluYSBsYSBtZWRpYSBkZSBzYWxpZGFzIHBhcmEgIGxhcyBwZXJzb25hcyBjdXlhIGVkYWQgZXMgbWVub3IgZGUgMjUgYcOxb3MuCgpgYGB7cn0KZGZfZm9ybTIgJT4lZmlsdGVyKGVkYWQ8MjUpICU+JSBzdW1tYXJpc2UobWVhbiA9IG1lYW4oc2FsaWRhc18sIG5hLnJtID0gVFJVRSkpICU+JQogICAgc3VtbWFyaXNlKG1lYW4gPSBtZWFuKG1lYW4pKSAlPiUKICAgIGFzLm51bWVyaWMoKSAtPiBlZGFkX3Byb20KZWRhZF9wcm9tCmBgYApgYGB7cn0Kbj1sZW5ndGgoZGZfZm9ybTIkc2FsaWRhc18pCnhiYXJyYT1tZWFuKGRmX2Zvcm0yJHNhbGlkYXNfKQpkZXN2X2VzdGFuZGFybXVlc3RyYT1zZChkZl9mb3JtMiRzYWxpZGFzXykKZGVzdmJhcnJhPWRlc3ZfZXN0YW5kYXJtdWVzdHJhL3NxcnQobikgIyBkZXN2aWFjaW9uIGVzdGFuZGFyIGRlIHBvYmxhY2lvbgpuaXZlbF9jb25maWFuemE9MC45NQptdV9ldmFsdWFyPWVkYWRfcHJvbQp6X29ic2VydmFkbz0oeGJhcnJhLW11X2V2YWx1YXIpL2Rlc3ZiYXJyYSAjIGVzdGFkw61zdGljbyBkZSBwcnVlYmEKcF92YWxvcj1wbm9ybSh6X29ic2VydmFkbykgICMgY29sYSBkZXJlY2hhCgpwX3NpZ25pZmljYW5jaWE9MS1uaXZlbF9jb25maWFuemEKCnBfdmFsb3IKCnBfc2lnbmlmaWNhbmNpYQpgYGAKCkRhZG8gcXVlIGVsIHBfdmFsb3IgZXMgbWF5b3IgYSBsYSBzaWduaWZpY2FuY2lhLCBubyBzZSByZWNoYXphIGxhIEhvLCB5YSBxdWUgaGF5IHBlcnNvbmFzIHF1ZSB0aWVuZW4gbWVub3IgZWRhZCBxdWUgMjUgYcOxb3MgeSBzYWxlbiBtw6FzIHF1ZSBlbCBwcm9tZWRpbyBkZSBmcmVjdWVuY2lhIGRlIHNhbGlkYS4KCkxhcyBoaXDDs3Rlc2lzIHBsYW50ZWFkYXMgZW4gcmVsYWNpw7NuIGFsIHRpcG8gZGUgdHJhYmFqbyB5IGdlbmVybywgc2UgY29ycm9ib3JhcsOhbiBwb3N0ZXJpb3JtZW50ZS4KCiMgRXN0YWTDrXN0aWNhIGluZmVyZW5jaWFsCgpQYXJhIGNvbm9jZXIgZW4gcXVlIG1lZGlkYSBzZSBhanVzdGFuIG8gYXNvY2lhbiBsYXMgdmFyaWFibGVzIHF1ZSByZWxhY2lvbmFtb3MgeSBvYnNlcnZhbW9zIGNvbW8gcGF0cm9uZXMsIHNlIGRldGVybWluYXLDoSAgc3UgZ3JhZG8gIGRlIGNvcnJlbGFjacOzbiwgcHJpbmljaXBhbG1lbnRlIHBvciByZWdyZXNpw7NuIGxpbmVhbC4KCiMgVGlwbyBkZSB0cmFiYWpvIC0+IEZyZWN1ZW5jaWEgZGUgc2FsaWRhIGEgbGEgc2VtYW5hCgojIyBWYXJpYWJsZSBpbmRlcGVuZGllbnRlOiBUaXBvIGRlIHRyYWJham8KIyMgVmFyaWFibGUgZGVwZW5kaWVudGU6IEZyZWN1ZW5jaWEgZGUgc2FsaWRhIGEgbGEgc2VtYW5hCgpQYXJhIGVzdGFibGVjZXIgc2kgZXhpc3RlIHVuYSByZWxhY2nDs24gZW50cmUgYW1iYXMgdmFyaWFibGVzLCBzZSByZXF1aWVyZSBkZSB1biBpbmRpY2Fkb3IgZXN0YWTDrXN0aWNvIG51bcOpcmljby5EYWRvIHF1ZSBsYSB2YXJpYWJsZSB0aXBvIGRlIHRyYWJham8gZXMgY2F0ZWfDs3JpY2Egbm9taW5hbCBzZSBkaWNvdG9taXphIGVuIDAsMSB5IGEgcGFydGlyIGRlIGVsbG8gbWVkaWFudGUgdW4gY29lZmljaWVudGUgZGUgY29ycmVsYWNpw7NuIGJpc2VyaWFsIHB1bnR1YWwgc2Ugb2J0aWVuZSBlbCBncmFkbyBkZSBjb3JyZWxhY2nDs24gZGUgYW1iYXMgdmFyaWFibGVzLgoKYGBge3J9CmRmX3RyYWJham88LWRmX2Zvcm0yJT4lZ3JvdXBfYnkoZW1wbGVvKSU+JWZpbHRlcihlbXBsZW8hPSJObyB0cmFiYWpvIiklPiVtdXRhdGUoVmFyaWFibGVfZGljb3RvbWl6YWRhID0gYXMubnVtZXJpYyhlbXBsZW8gPT0gIkZvcm1hbCIpKSU+JXNlbGVjdChlbXBsZW8sc2FsaWRhcyxWYXJpYWJsZV9kaWNvdG9taXphZGEpJT4lZmlsdGVyKHNhbGlkYXMhPSJNYXlvciA1IikKZGZfdHJhYmFqbwpgYGAKClBhcmEgc2FiZXIgc2kgdW5hIG1heW9yIGZyZWN1ZW5jaWEgZGUgc2FsaWRhIGVzdGEgYXNvY2lhZGEgYSB1biBlbXBsZW8gZGUgdGlwbyBmb3JtYWwuIFNlIGRldGVybWluYSBlbCBjb2VmaWNpZW50ZSBkZSBjb3JyZWxhY2nDs24gYmlzZXJpYWwgcHVudHVhbC4KCiMjIFBydWViYXMgZGUgSGlww7N0ZXNpczoKCiogSDA6IE5vIGV4aXN0ZSBjb3JyZWxhY2nDs24gZW50cmUgbGEgZnJlY3VlbmNpYSBkZSBzYWxpZGEgeSBlbCB0aXBvIGRlIHRyYWJham8uCgpIMTogRXhpc3RlIGNvcnJlbGFjacOzbiBlbnRyZSBsYSBmcmVjdWVuY2lhIGRlIHNhbGlkYSB5IGVsIHRpcG8gZGUgdHJhYmFqby4KCgoKJCRyYnA9KFgxYmFycmEtWGJhcnJhKS9TWCpzcXJ0KHAvcSkgJCQKCmBgYHtyfQpkZl90cmFiYWpvX2luZm9ybWFsPC1kZl90cmFiYWpvJT4lZmlsdGVyKFZhcmlhYmxlX2RpY290b21pemFkYT09MCkgIyB0cmFiYWphZG9yZXMgaW5mb3JtYWxlcwpkZl90cmFiYWpvX2Zvcm1hbDwtZGZfdHJhYmFqbyU+JWZpbHRlcihWYXJpYWJsZV9kaWNvdG9taXphZGE9PTEpICMgdHJhYmFqYWRvcmVzIGZvcm1hbGVzClgxYmFycmE8LW1lYW4oYXMubnVtZXJpYyhhcy5jaGFyYWN0ZXIoZGZfdHJhYmFqb19mb3JtYWwkc2FsaWRhcykpKSAjWDFiYXJyYT1wcm9tZWRpbyBkZSBsYSBmcmVjdWVuY2lhIGRlIHNhbGlkYSBwcm9tZWRpbyBkZSBsb3MgdHJhYmFqYWRvcmVzIGZvcm1hbGVzClhiYXJyYTwtbWVhbihhcy5udW1lcmljKGFzLmNoYXJhY3RlcihkZl90cmFiYWpvJHNhbGlkYXMpKSkjIFhiYXJyYT1wcm9tZWRpbyBkZSBsYSBmcmVjdWVuY2lhIGRlIHNhbGlkYSBwcm9tZWRpbyBkZWwgdG90YWwgZGUgcGVyc29uYXMgZW5jdWVzdGFkYXMKU1g8LXNkKGFzLm51bWVyaWMoYXMuY2hhcmFjdGVyKGRmX3RyYWJham8kc2FsaWRhcykpKSAjIFNYPWRlc3YuZXN0w6FuZGFyIGRlIGxhIGZyZWN1ZW5jaWEgZGUgc2FsaWRhIHByb21laWRvIGRlbCB0b3RhbCBkZSBwZXJzb25hcyBlbmN1ZXN0YWRhcwpwPWxlbmd0aChkZl90cmFiYWpvX2Zvcm1hbCRWYXJpYWJsZV9kaWNvdG9taXphZGEpL2xlbmd0aChkZl90cmFiYWpvJFZhcmlhYmxlX2RpY290b21pemFkYSkgICNwPSBwcm9wb3JjacOzbiBkZSB0cmFiYWphZG9yZXMgZm9ybWFsZXMgZW4gbGEgbXVlc3RyYQoKcT1sZW5ndGgoZGZfdHJhYmFqb19pbmZvcm1hbCRWYXJpYWJsZV9kaWNvdG9taXphZGEpL2xlbmd0aChkZl90cmFiYWpvJFZhcmlhYmxlX2RpY290b21pemFkYSkgI3E9cHJvcG9yY2nDs24gZGUgdHJhYmFqYWRvcmVzIGluZm9ybWFsZXMgZW4gbGEgbXVlc3RyYQoKCnJicDwtKChYMWJhcnJhLVhiYXJyYSkvU1gpKnNxcnQocC9xKSAgIyByYnA9Y29lZmljaWVudGUgZGUgY29ycmVsYWNpw7NuIGJpc2VyaWFsIHB1bnR1YWwKcmJwCgpgYGAKRWwgY29lZmljaWVudGUgZGUgY29ycmVsYWNpw7NuIGJpc2VyaWFsIHB1bnR1YWwgZXMgbXV5IGJham8geSBuZWdhdGl2bywgbGEgdGVuZGVuY2lhIGV4cGxpY2EgcXVlIGVzIGJhamEgbGEgY29ycmVsYWNpw7NuIGVudHJlIG1heW9yIGZyZWN1ZW5jaWEgZGUgc2FsaWRhIHByb21lZGlvIHkgdW4gdHJhYmFqbyBkZSB0aXBvIGluZm9ybWFsLgoKIyBNZWRpZGEgZGUgSW5tb3ZpbGl6YWNpw7NuIHNvY2lhbAoKIyBUaXBvIGRlIHRyYWJham8tPkRpc21pbnVjacOzbiBkZSBmcmVjdWVuY2lhIGRlIHNhbGlkYQoKIyMgVmFyaWFibGUgaW5kZXBlbmRpZW50ZTogVGlwbyBkZSB0cmFiYWpvCiMjIFZhcmlhYmxlIGRlcGVuZGllbnRlOiBEaXNtaW51Y2nDs24gZGUgZnJlY3VlbmNpYSBkZSBzYWxpZGEgcGFyYSBsb3MgdHJhYmFqYWRvcmVzIGRlIHRpcG8gZm9ybWFsCgpgYGB7cn0KZGZfaW5tb3ZpbGl6YWNpb248LWRmX2Zvcm0yJT4lZ3JvdXBfYnkoZW1wbGVvKSU+JWZpbHRlcihlbXBsZW8hPSJObyB0cmFiYWpvIiklPiVtdXRhdGUoVmFyaWFibGVfZGljb3RvbWl6YWRhID0gYXMubnVtZXJpYyhlbXBsZW8gPT0gIkZvcm1hbCIpKSU+JXNlbGVjdChlbXBsZW8sc29jaWFsLjA1LFZhcmlhYmxlX2RpY290b21pemFkYSkKZGZfaW5tb3ZpbGl6YWNpb24KCmBgYAoKIyMgUHJ1ZWJhcyBkZSBIaXDDs3Rlc2lzOgoKKiBIMDogTm8gZXhpc3RlIGNvcnJlbGFjacOzbiBlbnRyZSBsYSBkaXNtaW51Y2nDs24gZGUgZnJlY3VlbmNpYSBkZSBzYWxpZGEgeSBlbCB0aXBvIGRlIHRyYWJham8uCgoqIEgxOiBFeGlzdGUgY29ycmVsYWNpw7NuIGVudHJlIGxhIGRpc21pbnVjacOzbiBkZSBmcmVjdWVuY2lhIGRlIHNhbGlkYSB5IGVsIHRpcG8gZGUgdHJhYmFqby4KCkRldGVybWluYWNpw7NuIGRlbCBjb2VmaWNpZW50ZSBkZSBjb3JyZWxhY2nDs24gYmlzZXJpYWwgcHVudHVhbAoKJCRyYnA9KFgxYmFycmEtWGJhcnJhKS9TWCpzcXJ0KHAvcSkgJCQKCgpgYGB7cn0KZGZfbW92aWxpZGFkMTwtZGZfaW5tb3ZpbGl6YWNpb24lPiVmaWx0ZXIoVmFyaWFibGVfZGljb3RvbWl6YWRhPT0wKQpkZl9tb3ZpbGlkYWQyPC1kZl9pbm1vdmlsaXphY2lvbiU+JWZpbHRlcihWYXJpYWJsZV9kaWNvdG9taXphZGE9PTEpClgxYmFycmE8LW1lYW4oYXMubnVtZXJpYyhhcy5jaGFyYWN0ZXIoZGZfbW92aWxpZGFkMiRzb2NpYWwuMDUpKSkKWGJhcnJhPC1tZWFuKGFzLm51bWVyaWMoYXMuY2hhcmFjdGVyKGRmX2lubW92aWxpemFjaW9uJHNvY2lhbC4wNSkpKQpTWDwtc2QoYXMubnVtZXJpYyhhcy5jaGFyYWN0ZXIoZGZfaW5tb3ZpbGl6YWNpb24kc29jaWFsLjA1KSkpCgpwPWxlbmd0aChkZl9tb3ZpbGlkYWQyJFZhcmlhYmxlX2RpY290b21pemFkYSkvbGVuZ3RoKGRmX2lubW92aWxpemFjaW9uJFZhcmlhYmxlX2RpY290b21pemFkYSkKCgpxPWxlbmd0aChkZl9tb3ZpbGlkYWQxJFZhcmlhYmxlX2RpY290b21pemFkYSkvbGVuZ3RoKGRmX2lubW92aWxpemFjaW9uJFZhcmlhYmxlX2RpY290b21pemFkYSkKCnJicDwtKChYMWJhcnJhLVhiYXJyYSkvU1gpKnNxcnQocC9xKQpyYnAKCmBgYApFbCBjb2VmaWNpZW50ZSBwYXJhIGxhIG1lZGlkYSBkZSBJbm1vdmlsaXphY2nDs24gc29jaWFsIGluZGljYSB1bmEgY29ycmVsYWNpw7NuIG11eSBiYWphIGVudHJlIGxhcyB2YXJpYWJsZXMuIEVzdG8gc2lnbmlmaWNhIHF1ZSBtYXlvcmVzIGRpc21pbnVjaW9uZXMgZW4gbGEgZnJlY3VlbmNpYSBkZSBzYWxpZGEgIHNlIGNvcnJlbGFjaW9uYW4gbXV5IGJham8gY29uIGxhcyBwZXJzb25hcyBkZSB0cmFiYWpvIGZvcm1hbC4KCiMgTWVkaWRhOiBSZXRpcm8gMjAwMCBzb2xlcyBkZSBmb25kb3MgQUZQIGRlIHRyYWJhamFkb3JlcyBhZmlsaWFkb3MKCiMgVGlwbyBkZSB0cmFiYWpvLT5EaXNtaW51Y2nDs24gZGUgZnJlY3VlbmNpYSBkZSBzYWxpZGEKCiMjIFZhcmlhYmxlIGluZGVwZW5kaWVudGU6VGlwbyBkZSB0cmFiYWpvCiMjIFZhcmlhYmxlIGRlcGVuZGllbnRlOiBEaXNtaW51Y2nDs24gZGUgZnJlY3VlbmNpYSBkZSBzYWxpZGEKCgpgYGB7cn0KZGZfcmV0aXJvPC1kZl9mb3JtMiU+JWdyb3VwX2J5KGVtcGxlbyklPiVmaWx0ZXIoZW1wbGVvIT0iTm8gdHJhYmFqbyIpJT4lbXV0YXRlKFZhcmlhYmxlX2RpY290b21pemFkYSA9IGFzLm51bWVyaWMoZW1wbGVvID09ICJGb3JtYWwiKSklPiVzZWxlY3QoZW1wbGVvLGFmcDEuMDUsVmFyaWFibGVfZGljb3RvbWl6YWRhKQpkZl9yZXRpcm8KYGBgCiMjIFBydWViYXMgZGUgSGlww7N0ZXNpczoKCiogSDA6IE5vIGV4aXN0ZSBjb3JyZWxhY2nDs24gIGVudHJlIGxhIGRpc21pbnVjacOzbiBlbiBsYSBmcmVjdWVuY2lhIGRlIHNhbGlkYSB5IGVsIHRpcG8gZGUgdHJhYmFqby4KCiogSDE6IEV4aXN0ZSBjb3JyZWxhY2nDs24gIGVudHJlIGxhIGRpc21pbnVjacOzbiBlbiBsYSBmcmVjdWVuY2lhIGRlIHNhbGlkYSB5IGVsIHRpcG8gZGUgdHJhYmFqby4KCkRldGVybWluYWNpw7NuIGRlbCBjb2VmaWNpZW50ZSBkZSBjb3JyZWxhY2nDs24gYmlzZXJpYWwgcHVudHVhbAokJHJicD0oWDFiYXJyYS1YYmFycmEpL1NYKnNxcnQocC9xKSAkJAoKYGBge3J9CgpkZl9yZXRpcm8xPC1kZl9yZXRpcm8lPiVmaWx0ZXIoVmFyaWFibGVfZGljb3RvbWl6YWRhPT0wKQpkZl9yZXRpcm8yPC1kZl9yZXRpcm8lPiVmaWx0ZXIoVmFyaWFibGVfZGljb3RvbWl6YWRhPT0xKQpYMWJhcnJhPC1tZWFuKGFzLm51bWVyaWMoYXMuY2hhcmFjdGVyKGRmX3JldGlybzIkYWZwMS4wNSkpKQpYYmFycmE8LW1lYW4oYXMubnVtZXJpYyhhcy5jaGFyYWN0ZXIoZGZfcmV0aXJvJGFmcDEuMDUpKSkKU1g8LXNkKGFzLm51bWVyaWMoYXMuY2hhcmFjdGVyKGRmX3JldGlybyRhZnAxLjA1KSkpCgpwPWxlbmd0aChkZl9yZXRpcm8yJFZhcmlhYmxlX2RpY290b21pemFkYSkvbGVuZ3RoKGRmX3JldGlybyRWYXJpYWJsZV9kaWNvdG9taXphZGEpCgoKcT1sZW5ndGgoZGZfcmV0aXJvMSRWYXJpYWJsZV9kaWNvdG9taXphZGEpL2xlbmd0aChkZl9yZXRpcm8kVmFyaWFibGVfZGljb3RvbWl6YWRhKQoKcmJwPC0oKFgxYmFycmEtWGJhcnJhKS9TWCkqc3FydChwL3EpCnJicAoKYGBgCkVsIGNvZWZpY2llbnRlIGRlIGNvcnJlbGFjacOzbiBwYXJhIGxhIG1lZGlkYSBkZWwgcmV0aXJvIEFGUCBlcyBuZWdhdGl2byB5IGJham8uIEVsIHNpZ25vIG5lZ2F0aXZvIHNpZ25pZmljYSBxdWUgZWwgY29tcG9ydGFtaWVudG8gcG9zaXRpdm8gY29ycmVzcG9uZGUgYSBsb3MgdHJhYmFqYWRvcmVzIGluZm9ybWFsZXMuIFBvciBsbyAgcXVlIG1heW9yZXMgIGRpc21pbnVjaW9uZXMgZGUgZnJlY3VlbmNpYSBkZSBzYWxpZGEgc2UgY29ycmVsYWNpb25hbiBiYWpvIGNvbiBsYXMgcGVyc29uYXMgZGUgdHJhYmFqbyBpbmZvcm1hbC4KCgojIEfDqW5lcm8gLT4gRnJlY3VlbmNpYSBkZSBzYWxpZGEgYSBsYSBzZW1hbmEKIyMgVmFyaWFibGUgaW5kZXBlbmRpZW50ZTogR8OpbmVybwojIyBWYXJpYWJsZSBkZXBlbmRpZW50ZTogRnJlY3VlbmNpYSBkZSBzYWxpZGEgYSBsYSBzZW1hbmEKCmBgYHtyfQpkZl9nZW5lcm88LWRmX2Zvcm0yJT4lZ3JvdXBfYnkoZ2VuZXJvKSU+JW11dGF0ZShWYXJpYWJsZV9kaWNvdG9taXphZGEgPSBhcy5udW1lcmljKGdlbmVybyA9PSAiTWFzY3VsaW5vIikpJT4lc2VsZWN0KGdlbmVybyxzYWxpZGFzLFZhcmlhYmxlX2RpY290b21pemFkYSklPiVmaWx0ZXIoc2FsaWRhcyAhPSJNYXlvciA1IikKCgpkZl9nZW5lcm8KYGBgCiMjIFBydWViYXMgZGUgSGlww7N0ZXNpczoKCiogSDA6IE5vIGV4aXN0ZSB1bmEgY29ycmVsYWNpw7NuIGVudHJlIGZyZWN1ZW5jaWEgZGUgc2FsaWRhIGEgbGEgc2VtYW5hIHkgcGVyc29uYXMgZGVsIGfDqW5lcm8gZmVtZW5pbm8uCgoqIEgxOiBFeGlzdGUgdW5hIGNvcnJlbGFjacOzbiBlbnRyZSBmcmVjdWVuY2lhIGRlIHNhbGlkYSBhIGxhIHNlbWFuYSB5IHBlcnNvbmFzIGRlbCBnw6luZXJvIGZlbWVuaW5vLgoKCkRldGVybWluYWNpw7NuIGRlbCBjb2VmaWNpZW50ZSBkZSBjb3JyZWxhY2nDs24gYmlzZXJpYWwgcHVudHVhbAokJHJicD0oWDFiYXJyYS1YYmFycmEpL1NYKnNxcnQocC9xKSAkJAoKCmBgYHtyfQpkZl9mZW1lbmlubzwtZGZfZ2VuZXJvJT4lZmlsdGVyKFZhcmlhYmxlX2RpY290b21pemFkYT09MCkKZGZfbWFzY3VsaW5vPC1kZl9nZW5lcm8lPiVmaWx0ZXIoVmFyaWFibGVfZGljb3RvbWl6YWRhPT0xKQpYMWJhcnJhPC1tZWFuKGFzLm51bWVyaWMoYXMuY2hhcmFjdGVyKGRmX21hc2N1bGlubyRzYWxpZGFzKSkpClhiYXJyYTwtbWVhbihhcy5udW1lcmljKGFzLmNoYXJhY3RlcihkZl9nZW5lcm8kc2FsaWRhcykpKQpTWDwtc2QoYXMubnVtZXJpYyhhcy5jaGFyYWN0ZXIoZGZfZ2VuZXJvJHNhbGlkYXMpKSkKcD1sZW5ndGgoZGZfbWFzY3VsaW5vJFZhcmlhYmxlX2RpY290b21pemFkYSkvbGVuZ3RoKGRmX2dlbmVybyRWYXJpYWJsZV9kaWNvdG9taXphZGEpCgoKcT1sZW5ndGgoZGZfZmVtZW5pbm8kVmFyaWFibGVfZGljb3RvbWl6YWRhKS9sZW5ndGgoZGZfZ2VuZXJvJFZhcmlhYmxlX2RpY290b21pemFkYSkKCnJicDwtKChYMWJhcnJhLVhiYXJyYSkvU1gpKnNxcnQocC9xKQpyYnAKCmBgYApFbCBjb2VmaWNpZW50ZSBlcyBuZWdhdGl2byBwYXJhIGxhcyBwZXJzb25hcyBkZSBnw6luZXJvIG1hc2N1bGlubywgZXN0byBzaWduaWZpY2EgcXVlIGxhIGNvcnJlbGFjacOzbiBlcyBwb3NpdGl2YSBwYXJhIGxhcyBwZXJzb25hcyBkZSBnw6luZXJvIGZlbWVuaW5vLiBEYWRvIHF1ZSBlbCBjb2VmaWNpZW50ZSBlcyBwZXF1ZcOxbywgbWF5b3JlcyBmcmVjdWVuY2lhcyBkZSBzYWxpZGEgc2UgY29ycmVsYWNpb25hbiBiYWpvIGNvbiBsYXMgcGVyc29uYXMgZGUgZ8OpbmVybyBmZW1lbmluby4KCgojIE1lZGlkYTogRGlzcG9zaWNpw7NuIHNhbGlkYSBkZSBob21icmVzIHkgbXVqZXJlcyBlbiBkw61hcyBjb21wbGVtZW50YXJpb3MgKGx1bmVzLW1pw6lyY29sZXMtdmllcm5lcyAvIG1hcnRlcy1qdWV2ZXMtc8OhYmFkb3MpCgojIEfDqW5lcm8gLT4gRGlzbWludWNpw7NuIGRlIEZyZWN1ZW5jaWEgZGUgc2FsaWRhIGEgbGEgc2VtYW5hCgojIyBWYXJpYWJsZSBpbmRlcGVuZGllbnRlOkdlbmVybwojIyBWYXJpYWJsZSBkZXBlbmRpZW50ZTogRGlzbWludWNpw7NuIGRlIEZyZWN1ZW5jaWEgZGUgc2FsaWRhIGEgbGEgc2VtYW5hCgpgYGB7cn0KZGZfbWVkaWRhX2dlbmVybzwtZGZfZm9ybTIlPiVncm91cF9ieShnZW5lcm8pJT4lbXV0YXRlKFZhcmlhYmxlX2RpY290b21pemFkYSA9IGFzLm51bWVyaWMoZ2VuZXJvID09ICJNYXNjdWxpbm8iKSklPiVzZWxlY3QoZ2VuZXJvLG5vZGF5LjA1LFZhcmlhYmxlX2RpY290b21pemFkYSkKCgpkZl9tZWRpZGFfZ2VuZXJvCmBgYAoKIyMgUHJ1ZWJhcyBkZSBIaXDDs3Rlc2lzOgoKRW4gcmVsYWNpw7NuIGEgbGFzIGhpcMOzdGVzaXMgcXVlIHNlIHBsYW50ZWFyb24geSBubyBzZSByZWNoYXphcm9uCgoqIEgwOiBObyBleGlzdGUgdW5hIGNvcnJlbGFjacOzbiBlbnRyZSBsYSBkaXNtaW51Y2nDs24gZGUgZnJlY3VlbmNpYSBkZSBzYWxpZGEgYSBsYSBzZW1hbmEgeSBwZXJzb25hcyBkZWwgZ8OpbmVybyBmZW1lbmluby4KCiogSDE6IEV4aXN0ZSB1bmEgY29ycmVsYWNpw7NuIGVudHJlIGxhIGRpc21pbnVjacOzbiBkZSBmcmVjdWVuY2lhIGRlIHNhbGlkYSBhIGxhIHNlbWFuYSB5IHBlcnNvbmFzIGRlbCBnw6luZXJvIGZlbWVuaW5vLgoKCkRldGVybWluYWNpw7NuIGRlbCBjb2VmaWNpZW50ZSBiaXNlcmlhbDoKJCRyYnA9KFgxYmFycmEtWGJhcnJhKS9TWCpzcXJ0KHAvcSkgJCQKCgoKYGBge3J9CmRmX21lZF9mZW1lbmlubzwtZGZfbWVkaWRhX2dlbmVybyU+JWZpbHRlcihWYXJpYWJsZV9kaWNvdG9taXphZGE9PTApCmRmX21lZF9tYXNjdWxpbm88LWRmX21lZGlkYV9nZW5lcm8lPiVmaWx0ZXIoVmFyaWFibGVfZGljb3RvbWl6YWRhPT0xKQpYMWJhcnJhPC1tZWFuKGFzLm51bWVyaWMoYXMuY2hhcmFjdGVyKGRmX21lZF9tYXNjdWxpbm8kbm9kYXkuMDUpKSkKWGJhcnJhPC1tZWFuKGFzLm51bWVyaWMoYXMuY2hhcmFjdGVyKGRmX21lZGlkYV9nZW5lcm8kbm9kYXkuMDUpKSkKU1g8LXNkKGFzLm51bWVyaWMoYXMuY2hhcmFjdGVyKGRmX21lZGlkYV9nZW5lcm8kbm9kYXkuMDUpKSkKcD1sZW5ndGgoZGZfbWVkX21hc2N1bGlubyRWYXJpYWJsZV9kaWNvdG9taXphZGEpL2xlbmd0aChkZl9tZWRpZGFfZ2VuZXJvJFZhcmlhYmxlX2RpY290b21pemFkYSkKCgpxPWxlbmd0aChkZl9tZWRfZmVtZW5pbm8kVmFyaWFibGVfZGljb3RvbWl6YWRhKS9sZW5ndGgoZGZfbWVkaWRhX2dlbmVybyRWYXJpYWJsZV9kaWNvdG9taXphZGEpCgoKcmJwPC0oKFgxYmFycmEtWGJhcnJhKS9TWCkqc3FydChwL3EpICAjcD1pbmZvcm1hbC9tdWVzdHJhICwgcT1mb3JtYWwvbXVlc3RyYQpyYnAKCmBgYAoKRWwgY29lZmljaWVudGUgZXMgbXV5IGJham8gcG9yIGxvIHF1ZSBleGlzdGUgdW5hIGNvcnJlbGFjacOzbiBtdXkgYmFqYSBlbnRyZSBtYXlvcmVzIGRpc21pbnVjaW9uZXMgZGUgZnJlY3VlbmNpYXMgZGUgc2FsaWRhIGEgbGEgc2VtYW5hIHkgcGVyc29uYXMgZGUgZ2VuZXJvIG1hc2N1bGluby4KCiMgRWRhZCAtPiBGcmVjdWVuY2lhIGRlIHNhbGlkYQoKIyMgUHJ1ZWJhcyBkZSBIaXDDs3Rlc2lzOgoqIFNpZ25pZmljYW5jaWE6IDAuMDUKCiogSDA6IE5vIGV4aXN0ZSB1bmEgY29ycmVsYWNpw7NuIGxpbmVhbCBlbnRyZSBsYSBlZGFkIHkgbGEgZnJlY3VlbmNpYSBkZSBzYWxpZGEuCgoqIEgxOiBFeGlzdGUgdW5hIGNvcnJlbGFjacOzbiBsaW5lYWwgZW50cmUgbGEgZWRhZCB5IGxhIGZyZWN1ZW5jaWEgZGUgc2FsaWRhLgoKYGBge3J9CmRhdG9zLmYgPC1hcy5jaGFyYWN0ZXIoZGZfZm9ybTIkc2FsaWRhcykKZGF0b3MubjwtcmVwbGFjZShkYXRvcy5mLGRhdG9zLmY9PSJNYXlvciA1IiwiNiIpCmRhdG9zLm48LWFzLmludGVnZXIoZGF0b3MubikKZWRhZF9mcmVjIDwtIGRhdGEuZnJhbWUoZGZfZm9ybTIkZWRhZCxkYXRvcy5uKQplZGFkX2ZyZWMKcGxvdChkYXRvcy5ufmRmX2Zvcm0yLmVkYWQsZGF0YSA9IGVkYWRfZnJlYywgeGxhYj0iZWRhZCIsIHlsYWI9ImZyZWN1ZW5jaWEgZGUgc2FsaWRhIikKZWRhZF9mcmVjX2xtIDwtIGxtKGRhdG9zLm5+ZGZfZm9ybTIuZWRhZCwgZGF0YSA9ZWRhZF9mcmVjICkKYWJsaW5lKGVkYWRfZnJlY19sbSkKCmNvcih4ID0gZGZfZm9ybTIkZWRhZCAsIHkgPShkYXRvcy5uKSwgbWV0aG9kID0gInBlYXJzb24iKQpgYGAKTGEgZ3LDoWZpY2EgZGVsIG1vZGVsbyBtdWVzdHJhIHF1ZSBlbCBjb21wb3J0YW1pZW50byBkZSBsYSB2YXJpYWJsZSBkZXBlbmRpZW50ZSBlcyBjYXNpIGNvbnN0YW50ZSBhIGxvIGxhcmdvIGRlIGxhIGVkYWQsIGVzIGRlY2lyLCBubyBoYXkgY2FtYmlvcyBzaWduaWZjYXRpdm9zIGVuIGxhIGZyZWN1ZW5jaWEgZGUgc2FsaWRhIHRyYXMgdW4gYXVtZW50byBvIGRpc21pbnVjacOzbiBkZSBsYSBlZGFkLiBSZXNwZWN0byBhIGxhIG51YmUgZGUgcHVudG9zLCBleGlzdGVuIG11Y2hvcyBwdW50b3MgYWxlamFkb3MgYWwgYWp1c3RlIGRlIHJlZ3Jlc2nDs24gbGluZWFsIHkgc2UgZGlzcGVyc2FuIHZhcmlhYmxlbWVudGUgYSBtZWRpZGEgcXVlIGF1bWVudGEgbGEgZWRhZC4KCkVsIGNvZWZpY2llbnRlIGRlIGNvcnJlbGFjacOzbiBkZSBwZWFyc29uIHBhcmEgZXN0YXMgdmFyaWFibGVzIGVzIG11eSBiYWpvIHkgcG9zaXRpdm8uIFVuYSBtYXlvciBlZGFkIGVzIDAuMDEyIGFzb2NpYWRhIGEgdW5hIG1heW9yIGZyZWN1ZW5jaWEgZGUgc2FsaWRhLCBlcyBkZWNpciwgcHJlc2VudGFuIHVuIGdyYWRvIGRlIGFzb2NpYWNpw7NuICBtdXkgZGViaWwuIEVzdG8gc2lnbmlmaWNhIHF1ZSB1bmEgbWF5b3IgZWRhZCBubyBpbXBsaWNhIHVuYSBtYXlvciBmcmVjdWVuY2lhIGRlIHNhbGlkYS4gUGFyYSBjb3Jyb2JvcmFyIGVsbG8gc2UgYW5hbGl6YSBsb3MgY29lZmljaWVudGVzIGRlbCBtb2RlbG8sIHNlIGRlc2NyaWJlIHkgYW5hbGl6YW4gbG9zIHJlc2lkdW9zIGRlbCBtb2RlbG8uCgoKYGBge3J9CnN1bW1hcnkoZWRhZF9mcmVjX2xtKQpgYGAKU2Ugb2J0dXZvIHVuIG1vZGVsbyBjb24gcGVuZGllbnRlIG11eSBiYWphLCBjb24gdW4gcC12YWxvciBtYXlvciBhIGxhIHNpZ25pZmljYW5jaWEgZXN0YWJsZWNpZGEsIHBvciBsbyBxdWUgbm8gc2UgcmVjaGF6YSBsYSBoaXDDs3Rlc2lzIG51bGEgZGUgcXVlIGVzdGUgdmFsb3Igc2VhIDAsIGVzIGNlcmNhbm8gYSAwLiBSZXNwZWN0byBhbCBpbnRlcmNlcHRvLCBjdWFuZG8gbGEgZWRhZCBlcyAwLCAgZWwgcF92YWxvciBlcyBtdWNobyBtZW5vciBhIGxhIHNpZ25pZmljYW5jaWEgZXN0YWJsZWNpZGEsIHBvciBsbyBxdWUgc2UgcmVjaGF6YSBsYSBoaXDDs3Rlc2lzIG51bGEgcXVlIHNlYSAwLCBlcyAyLjQzNyB2ZWNlcyBkZSBzYWxpZGEuIEVsIGNvZWZpY2llbnRlIGRlIGRldGVybWluYWNpw7NuIGluZGljYSBxdWUgZWwgMC4wMDAxNTMgJSBkZSB2YXJpYWNpw7NuIGRlIGxhcyBmcmVjdWVuY2lhcyBkZSBzYWxpZGEgc2UgcHVlZGUgZXhwbGljYXIgcG9yIGxhIGVkYWQuIEVzIG11eSBiYWpvIHkgcG9yIHRhbnRvIGNvaW5jaWRlIGNvbiBlbCBiYWpvIGdyYWRvIGRlIGFzb2NpYWNpw7NuIGRlIGxhcyB2YXJpYWJsZXMuCgojQW5hbGlzaXMgZGUgcmVzaWR1b3MKYGBge3J9CnBsb3QoZWRhZF9mcmVjX2xtKQpgYGAKCkVuIGxhIHByaW1lcmEgZ3LDoWZpY2EgZGUgbG9zIHJlc2lkdW9zIFZzLiBsb3MgdmFsb3JlcyBhanVzdGFkb3MgLCBzZSBvYnNlcnZhIHF1ZSBsYSBtZWRpYSBkZSBsb3MgcmVzaWR1b3Mgc2UgZGVzdsOtYSBkZSAwIGEgbG8gbGFyZ28gZGUgbG9zIHZhbG9yZXMgYWp1c3RhZG9zLiBEZSBsYSBtaXNtYSBtYW5lcmEsIHNlIG9ic2VydmEgdW5hIGRpc3BlcnNpw7NuIHZhcmlhYmxlIGEgbG8gbGFyZ28gZGUgbG9zIHZhbG9yZXMgYWp1c3RhZG9zLCBlcyBkZWNpciwgbm8gaGF5IGhvbW9jZWRhc3RpY2lkYWQuIEFsIGluaWNpbywgc2Ugb2JzZXJ2YSBxdWUgbG9zIHJlc2lkdW9zIGRlYmFqbyBkZSAwIHNvbiBtYXlvcmVzIHF1ZSBsb3MgcXVlIHNlIGVuY3VlbnRyYW4gZW5jaW1hIGRlIDAsIGxhIGRpc3RyaWJ1Y2nDs24gZGUgbG9zIHB1bnRvcyBubyBlcyBzaW3DqXRyaWNhLiBFbiBlbCBtZWRpbywgZXhpc3RlIG1heW9yIGRpc3BlcnNpw7NuIGVuY2ltYSBkZSAwLCBhbCBmaW5hbCBlcyBhw7puIG3DoXMgbm90YXJpYSBlc2EgZGlzcGVyc2nDs24uIEVsbG8gaW5kaWNhIHF1ZSBsb3MgcmVzaWR1b3MgZGVsIG1vZGVsbyBzZSBlc3TDoW4gZGlzcGVyc2FuZG8gZGUgdGFsIGZvcm1hIHF1ZSBubyBzZSBkaXN0cmlidXllbiBjb21vIHVuYSB2YXJpYWJsZSBub3JtYWwuIERhZG8gcXVlIGxvcyBlcnJvcmVzIG5vIHNpZ3VlbiB1bmEgZGlzdHJpYnVjacOzbiBub3JtYWwsIHNlIHB1ZWRlIGFmaXJtYXIgcXVlIGVsIGFqdXN0ZSBjb21vIHJlZ3Jlc2nDs24gbGluZWFsICBubyBlcyBidWVuYSBhcHJveGltYWNpw7NuIHBhcmEgZXhwbGljYXIgY29tbyBjYW1iaWEgbGEgZnJlY3VlbmNpYSBhIHBhcnRpciBkZSBsYSBlZGFkLgoKCkVuIGxhIHNlZ3VuZGEgZ3LDoWZpY2EgcmVzaWR1b3MgZXN0YW5kYXJpemFkb3MgVnMuIGN1YW50aWxlcyB0ZcOzcmljb3MsIHNlIG9ic2VydmEgcXVlIGEgbWVkaWRhIHF1ZSBpbmNyZW1lbnRhbiBsb3MgcXVhbnRpbGVzIHRlw7NyaWNvcywgZXhpc3RlbiBtdWNob3MgcmVzaWR1b3MgcXVlIGluY2lkZW4gZW4gZWwgbWlzbW8gdmFsb3IgeSBhbGd1bm8gZGUgZXN0b3Mgc2UgYWxpbmVhbiBhIGxhIHJlY3RhIGRlIGxvcyBjdWFudGlsZXMgdGXDs3JpY29zLiAgRXN0byBzZSBkZWJlIGEgcXVlIGxhIHZhcmlhYmxlIGRlcGVuZGllbnRlIGRlbCBtb2RlbG8sIGFsZ3VuYXMgdmVjZXMgc2UgcmVwaXRlIHBhcmEgY2FkYSBlZGFkLiBMbGVnYSB1biBtb21lbnRvIGVuIGVsIHF1ZSBsb3MgZXJyb3JlcyBlc3RhbmRhcml6YWRvcyBzZSBkZXNhbGluZWFuIGNvbXBsZXRhbWVudGUgZGUgbGEgcmVjdGEuIEVzdG8gc2UgZGViZSBhIHF1ZSBleGlzdGVuIHNhbHRvcyBlbiBlbCB2YWxvciBkZSBsYSB2YXJpYWJsZSBkZXBlbmRpZW50ZSBxdWUgZWwgZXJyb3IgZXN0YW5kYXJpemFkbyBubyBhanVzdGEgcG9ycXVlIGxvcyBkYXRvcyBubyBzaWd1ZW4gZWwgY29tcG9ydGFtaWVudG8gZGUgdW5hIHJlZ3Jlc2nDs24gbGluZWFsLiBMYSBpZGVhIGRlIGV4cGxpY2FyIHVuYSBtYXlvciBmcmVjdWVuY2lhIGRlIHNhbGlkYSBjb24gIHVuYSBtYXlvciBlZGFkIG5vIGVzIGNvcnJlY3RhbWVudGUgYWp1c3RhZGEgeWEgcXVlIGV4aXN0ZSBldmlkZW5jaWEgcXVlIGxvcyBkYXRvcyBubyBzaWd1ZW4gZXN0YSB0ZW5kZW5jaWEuCgoKQSBwYXJ0aXIgZGUgbGEgZXZpZGVuY2lhIGVzdGFkw61zdGljYSwgc2UgYWZpcm1hIHF1ZSBlbCBtb2RlbG8gZGUgcmVncmVzacOzbiBsaW5lYWwgcXVlIGJ1c2NhYmEgZXhwbGljYXIgbGEgZnJlY3VlbmNpYSBkZSBzYWxpZGEgbWVkaWFudGUgbGEgZWRhZCBubyByZXN1bHRhIHVuYSBidWVuYSBhcHJveGltYWNpw7NuLiBQb3IgbG8gdGFudG8gc2UgcmVjaGF6YSBsYSBIMC4gTGFzIHJhem9uZXMgZXN0w6FuIGRpcmVjdGFtZW50ZSByZWxhY2lvbmFkYXMgYWwgY29tcG9ydGFtaWVudG8gZGUgbG9zIGRhdG9zIHJlY29sZWN0YWRvcy4gRHVyYW50ZSBsYSBkZXNjcmlwY2nDs24gIGRlIGxhIGVkYWQgZW4gYmFzZSBhIGxhcyBmcmVjdWVuY2lhcyBkZSBzYWxpZGEgc2Ugb2JzZXJ2w7MgcXVlIGxhcyBkaXN0cmlidWNpb25lcyBkZSBsYXMgZWRhZGVzIG5vIGVyYW4gbXV5IGRpZmVyZW50ZXMsIGFsZ3VuYXMgY29pbmNpZMOtYW4gY2FkYSB2ZXogcXVlIGluY3JlbWVudGFiYSBsYSBmcmVjdWVuY2lhIGRlIHNhbGlkYS4gU2UgZGViZSBhIHF1ZSBsb3MgZW5jdWVzdGFkb3MgY29uIG3DoXMgZWRhZCBhIHZlY2VzIHNhbMOtYW4gbcOhcyBxdWUgbWVub3MsIGRlIGlndWFsIGZvcm1hIHN1Y2Vkw61hIGNvbiBsb3MgZGUgbWVub3MgZWRhZCwgbm8gc2UgZXZpZGVuY2lhYmEgY2xhcmFtZW50ZSB1bmEgdGVuZGVuY2lhIGRlZmluaWRhLiBTZSBjb21wcm9iw7MgZXN0YSBhZmlybWFjacOzbiB0YW1iacOpbiwgIG1lZGlhbnRlIHBydWViYSBkZSBoaXDDs3Rlc2lzIGRlIGxhIG1lZGlhIGRlIGxhIG11ZXN0cmEsIGVuIGVsIGN1YWwgbm8gc2UgcmVjaGF6byAgbGEgaGlww7N0ZXNpcyBudWxhIGRlIHF1ZSBsYXMgcGVyc29uYXMgbWVub3JlcyBkZSAyNSBhw7FvcyBubyBuZWNlc2FyaWFtZW50ZSB0ZW7DrWFuIG1lbm9yZXMgc2FsaWRhcywgZGViaWRvIGEgcXVlIGxhIG1lZGlhIGRlIGVsbG9zIGVyYSBtYXlvciBxdWUgbGEgbWVkaWEgZGUgbGEgbXVlc3RyYSB5IGVsIHBfdmFsb3IgcmVzdWx0YWJhIG1heW9yIHF1ZSBsYSBzaWduaWZpY2FuY2lhLCBsbyBjdWFsIGltcGxpY2FiYSBxdWUgaGFiw61hbiBwZXJzb25hcyBtZW5vcmVzIGRlIDI1IGHDsW9zIHF1ZSBzYWzDrWFuIG3DoXMgcXVlIGVsIHByb21lZGlvIGRlIGxhIG11ZXN0cmEuCgojIEluZ3Jlc29zIC0+IGZyZWN1ZW5jaWEgZGUgc2FsaWRhCgojIyBQcnVlYmFzIGRlIEhpcMOzdGVzaXM6CgoqIFNpZ25pZmljYW5jaWE6IDAuMDUKCiogSDA6IE5vIGV4aXN0ZSBjb3JyZWxhY2nDs24gbGluZWFsIGVudHJlICBpbmdyZXNvcyBtZW5zdWFsZXMgeSAgbGEgZnJlY3VlbmNpYSBkZSBzYWxpZGEgYSBsYSBzZW1hbmEuCgoqIEgxOiBFeGlzdGUgY29ycmVsYWNpw7NuIGxpbmVhbCBlbnRyZSBpbmdyZXNvcyBtZW5zdWFsZXMgeSBsYSAgZnJlY3VlbmNpYSBkZSBzYWxpZGEgYSBsYSBzZW1hbmEuCgoKYGBge3J9CgojZGZfZm9ybTIKCigxMDAwICogKGFzLm51bWVyaWMoZGZfZm9ybTIkaW5ncmVzbykgLSAxKSkgLT4geAphcy5udW1lcmljKGRmX2Zvcm0yJHNhbGlkYXMpIC0gMSAtPiB5CgppbmdyZXNvc19mcmVjPWxtKHl+eCkKcGxvdCh5fngsIHhsYWI9IkluZ3Jlc29zIG1lbnN1YWxlcyIsIHlsYWI9ImZyZWN1ZW5jaWEgZGUgc2FsaWRhIikKYWJsaW5lKGluZ3Jlc29zX2ZyZWMpCmNvcih4LCB5LCBtZXRob2Q9InBlYXJzb24iKQoKYGBgCkxhIHRlbmRlbmNpYSBtdWVzdHJhIHVuIGxldmUgZGVjcmVjaW1pZW50byBlbiBsYSBmcmVjdWVuY2lhIGRlIHNhbGlkYSBhbCBhdW1lbnRhciBsb3MgaW5ncmVzb3MuIFNlIG9ic2VydmEgcXVlIGV4aXN0ZW4gZGUgbcOhcyBhIG1lbm9zIHB1bnRvcyBhbGVqYWRvcyBkZWwgYWp1c3RlICBsaW5lYWwgYSBtZWRpZGEgcXVlIGluY3JlbWVudGFuIGxvcyBpbmdyZXNvcyBtZW5zdWFsZXMuIERlbCBtaXNtbyBtb2RvLCBleGlzdGUgdW5hIGRpc3BlcnNpw7NuIHZhcmlhYmxlIGRlIGxhIG51YmUgZGUgcHVudG9zIGEgbWVkaWRhIHF1ZSBpbmNyZW1lbnRhbiBsb3MgaW5ncmVzb3MgbWVuc3VhbGVzLgoKRWwgY29lZmljaWVudGUgZGUgY29ycmVsYWNpw7NuIGRlIHBlYXJzb24gZXMgbmVnYXRpdm8geSBiYWpvLCBlc3RvIHNpZ25pZmljYSBxdWUgZWwgZ3JhZG8gZGUgYXNvY2lhY2nDs24gZGUgbGFzIHZhcmlhYmxlcyBlcyBiYWpvLiBFcyBkZWNpciwgbWVub3JlcyBmcmVjdWVuY2lhcyBkZSBzYWxpZGEgc2UgYXNvY2lhIHVuIC0wLjA1MTUwODQ5ICBhIG1heW9yZXMgaW5ncmVzb3MgbWVuc3VhbGVzLiAgUGFyYSBjb3Jyb2JvcmFyIGVsbG8gc2UgYW5hbGl6YSBsb3MgY29lZmljaWVudGVzIGRlbCBtb2RlbG8sIHNlIGRlc2NyaWJlIHkgYW5hbGl6YW4gbG9zIHJlc2lkdW9zIGRlbCBtb2RlbG8uCgoKYGBge3J9CnN1bW1hcnkoaW5ncmVzb3NfZnJlYykKCmBgYApTZSBvYnR1dm8gdW5hIHBlbmRpZW50ZSBtdXkgYmFqYSB5IG5lZ2F0aXZhIGRlIC0yLjk1ICoxMF4oLTUpLiBFbCBzaWdubyBuZWdhdGl2byBpbmRpY2EgcXVlIGxhIHZhcmlhYmxlIGRlcGVuZGllbnRlIGVuIGVzdGUgY2FzbyAsIGxhIGZyZWN1ZW5jaWEgZGUgc2FsaWRhIHRpZW5kZSBhIHNlciBtZW5vciBhIG1lZGlkYSBxdWUgaW5jcmVtZW50YW4gbG9zIGluZ3Jlc29zIG1lbnN1YWxlcy4gTGEgcGVuZGllbnRlIGRlbCBtb2RlbG8gc2Ugb2J0dXZvIGNvbiBwX3ZhbG9yIG1heW9yIGEgbGEgc2lnbmlmaWNhbmNpYSBlc3RhYmxlY2lkYSwgcG9yIGxvIHF1ZSBubyBzZSBwdWVkZSByZWNoYXphciBsYSBoaXDDs3Rlc2lzIG51bGEgZGUgcXVlIGVzdGEgZXMgMCwgeWEgcXVlIGVzIG11eSBwcsOzeGltbyBhIDAuIFJlc3BlY3RvIGFsIGludGVyY2VwdG8gLCBjdWFuZG8gbG9zIGluZ3Jlc29zIHNvbiAgbnVsb3MgIGVzIDIuNTYyIHZlY2VzIGRlIHNhbGlkYSwgZXN0ZSB2YWxvciBzZSBvYnR1dm8gY29uIHVuIHBfdmFsb3IgbWVub3IgYSBsYSBzaWduaWZpY2FuY2lhIGVzdGFibGVjaWRhLCBwb3IgbG8gcXVlIHNlIHJlY2hhemEgbGEgaGlww7N0ZXNpcyBudWxhIGRlIHF1ZSBlc3RhIHNlYSAwLiAgRWwgY29lZmljaWVudGUgZGUgZGV0ZXJtaW5hY2nDs24gZGVsIG1vZGVsbyBpbmRpY2EgcXVlIGVsIDAuMDAyNjUzJSBkZSB2YXJpYWNpw7NuIGRlIGxhIGZyZWN1ZW5jaWEgZGUgc2FsaWRhIHNlIHB1ZWRlIGV4cGxpY2FyIHBvciBsb3MgaW5ncmVzb3MgbWVuc3VhbGVzLiBFbCBncmFkbyBkZSBleGxpY2FjacOzbiBlc3RhYmxlY2lkbyBwYXJhIGxhcyB2YXJpYWJsZXMgZXMgbXV5IGJham8sIHBvciB0YW50byBjb2luY2lkZSBjb24gbGEgYmFqYSBhc29jaWFjacOzbiBkZSBlc3RhcyBkZXRlcm1pbmFkbyBhbnRlcmlvcm1lbnRlIG1lZGlhbnRlIGVsIGNvZWZpY2llbnRlIGRlIHBlYXJzb24uCgpgYGB7cn0KcGxvdChpbmdyZXNvc19mcmVjKQpgYGAKCkVuIGxhIHByaW1lcmEgZ3LDoWZpY2EgZGUgbG9zIHJlc2lkdW9zIFZzLiB2YWxvcmVzIGFqdXN0YWRvcyBzZSBtdWVzdHJhIHF1ZSBsYSBtZWRpYSBkZSBsb3MgZXJyb3JlcyBzZSBkZXN2w61hIGRlIDAsIHlhIHF1ZSBleGlzdGUgdW4gbWF5b3IgZ3JhZG8gZGUgZGlzcGVyc2nDs24gZGViYWpvIGRlIDAgYSBtZWRpZGEgcXVlIGF1bWVudGFuIGxvcyB2YWxvcmVzIGFqdXN0YWRvcy4gRGUgbGEgbWlzbWEgbWFuZXJhLCBzZSBvYnNlcnZhIHF1ZSBhbCBpbmljaW8gZXhpc3RlbiBtYXlvcmVzIHJlc2lkdW9zIGRlYmFqbyBkZSAwIHF1ZSBlbmNpbWEgZGUgMCwgZW4gZWwgbWVkaW8gdGFtYmnDqW4gc2UgZGEgZXN0ZSBjb21wb3J0YW1pZW50bywgYWwgcGFyZWNlciBhbCBmaW5hbCBsb3MgcmVzaWR1b3Mgc29uIGRpc3RyaWJ1aWRvcyBzaW3DqXRyaWNhbWVudGUuIERhZG8gcXVlIGxhIGRpc3BlcnNpw7NuIG5vIGVzIGZpamEgeSBzaW3DqXRyaWNhIHBhcmEgdG9kb3MgbG9zIGVycm9yZXMgYSBtZWRpZGEgcXVlIHNlIGF2YW56YSBlbiBlbCBhanVzdGUgZGVsIG1vZGVsbywgc2UgcHVlZGUgZGVjaXIgcXVlIGxvcyByZXNpZHVvcyBubyBzaWd1ZW4gdW5hIGRpc3RyaWJ1Y2nDs24gbm9ybWFsLiBMYXMgdmFyaWFjaW9uZXMgZW4gbG9zIHJlc2lkdW9zIGV4cGxpY2FuIHF1ZSBsYSB2YXJpYWJsZSBkZXBlbmRpZW50ZSwgIG5vIGNyZWNlIG8gZGVjcmVjZSBjb24gdW5hIHRlbmRlbmNpYSBkZWZpbmlkYS4gRGViaWRvIGEgcXVlIG5vIHNpZ3VlbiB1bmEgZGlzdHJpYnVjacOzbiBub3JtYWwsIGVsIGFqdXN0ZSBjb21vIHJlZ3Jlc2nDs24gbGluZWFsIHBhcmEgZXhwbGljYXIgbGEgZnJlY3VlbmNpYSBkZSBzYWxpZGEgYSBwYXJ0aXIgZGUgbG9zIGluZ3Jlc29zIG5vIHJlc3VsdGFyw61hICB1bmEgYnVlbmEgYXByb3hpbWFjacOzbi4KCgpFbiBsYSBzZWd1bmRhIGdyw6FmaWNhIGRlIGxvcyByZXNpZHVvcyBlc3RhbmRhcml6YWRvcyBWcy4gY3VhbnRpbGVzIHRlw7NyaWNvcy4gU2Ugb2JzZXJ2YSBxdWUgaW5jaWRlbiB2YXJpb3MgcmVzaWR1b3MgZXN0YW5kYXJpemFkb3MgZW4gdW4gbWlzbW8gdmFsb3IsIGRlYmlkbyBhIHF1ZSBlbCB2YWxvciBkZSBsYSAgdmFyaWFibGUgZGVwZW5kaWVudGUgYWxndW5hcyB2ZWNlcyBzZSByZXBpdGUuIEFsZ3Vub3MgZGUgZXN0b3MgcmVzaWR1b3MgZXN0YW5kYXJpemFkb3Mgc2UgYWxpbmVhbiBhIGxhIHJlY3RhIGRlIGxvcyBjdWFydGlsZXMgdMOpb3JpY29zLCBhbGd1bm9zIGVzdGFuIGNlcmNhLCBwZXJvIGxsZWdhIHVuIHB1bnRvIGVuIGVsIHF1ZSBlbCAgYWxlamFtaWVudG8gZGUgbGEgcmVjdGEgZXMgc2lnbmlmaWNhdGl2bywgdGFsIHF1ZSBhIHBlc2FyIGRlIGVzdGFyIGVzdGFuZGFyaXphZG8gZWwgZXJyb3Igbm8gYWp1c3RhIGVsIGNvbXBvcnRhbWllbnRvIGRlIGxhIHJlZ3Jlc2nDs24gbGluZWFsLiBFbCB2YWxvciBkZSBsYSB2YXJpYWJsZSBkZXBlbmRpZW50ZSB2YXLDrWEgZGUgdGFsIG1hbmVyYSBxdWUgcmVzdWx0YSBkw61maWNpbCBhanVzdGFybG8sIGVzIHBvciBlbGxvIHF1ZSBsb3MgZGF0b3MgIG5vIHNpZ3VlbiBlc3RhIHRlbmRlbmNpYS4KCgpBIHBhcnRpciBkZSBsYSBldmlkZW5jaWEgZXN0YWTDrXN0aWNhLCBzZSBhZmlybWEgcXVlIGVsIG1vZGVsbyBkZSByZWdyZXNpw7NuIGxpbmVhbCBxdWUgYnVzY2FiYSBleHBsaWNhciBsYSBmcmVjdWVuY2lhIGRlIHNhbGlkYSAgbWVkaWFudGUgbG9zIGluZ3Jlc29zIG1lbnN1YWxlcyBubyByZXN1bHRhIHVuYSBidWVuYSBhcHJveGltYWNpw7NuLiBQb3IgbG8gdGFudG8gc2UgcmVjaGF6YSBsYSBIMC4gTGFzIHJhem9uZXMgc2UgZW5jdWVudHJhbiBjb25lY3RhZGFzIGEgbGEgcGFydGUgZGVzY3JpcHRpdmEgcXVlIHNlIHJlYWxpesOzIHBhcmEgY2FkYSBpbnRlcnZhbG8gZGUgaW5ncmVzb3MsIGVuIGxvcyBjdWFsZXMgc2UgbW9zdHLDsyBxdWUgbGEgZGlzdHJpYnVjacOzbiBkZSBsYXMgZnJlY3VlbmNpYXMgZGUgc2FsaWRhIGEgbWVkaWRhIHF1ZSBhdW1lbnRhYmFuIGxvcyBpbnRlcnZhbG9zLCByZXN1bHRhYmFuICBtZW5vcmVzIGVuIG1lZGlhbmEgcXVlIGVsIGludGVydmFsbyBvIHJhbmdvIGRlIFswLDEwMDBdIHNvbGVzLCBwb3IgbG8gcXVlIHBhcmVjw61hIGZhdm9yZWNlcnNlIHF1ZSBtZW5vcmVzIGZyZWN1ZW5jaWFzIGRlIHNhbGlkYSBlc3RhYmFuIHJlbGFjaW9uYWRhcyBjb24gbWF5b3JlcyBpbmdyZXNvcy4gRXN0byBzZSBjb21wcm9iw7MgbWVkaWFudGUgdW5hIHBydWViYSBkZSBoaXDDs3Rlc2lzIGNvbXBhcmFuZG8gbGFzIG1lZGlhcyBlbnRyZSBsYXMgZnJlY3VlbmNpYXMgZGUgc2FsaWRhIGRlIGFxdWVsbG9zIGNvbiB1biBpbnRlcnZhbG8gZGUgaW5ncmVzbyBtZW5vciBhIDEwMDAgc29sZXMgeSBkZSBsYSBtdWVzdHJhLCBlbiBlc3RhIHNlIHJlY2hhem8gbGEgaGlww7N0ZXNpcyBudWxhIGRlIHF1ZSBsYXMgcGVyc29uYXMgY29uIG1lbm9yZXMgZnJlY3VlbmNpYXMgZGUgc2FsaWRhIG5vIG5lY2VzYXJpYW1lbnRlIHRpZW5lbiBpbmdyZXNvcyAgICBtZW5zdWFsZXMgbWF5b3JlcyBhIDEwMDAgc29sZXMgZGFkbyBxdWUgZWwgcF92YWxvciByZXN1bHTDsyBtZW5vciBxdWUgbGEgc2lnbmlmaWNhbmNpYSBlc3RhYmxlY2lkYS4gRXN0byBubyBkYWJhIGNlcnRlemEgZGUgcXVlIGxhcyBwZXJzb25hcyBjb24gbWF5b3JlcyBpbmdyZXNvcyBhIDEwMDAgc29sZXMgdGVuw61hbiBtZW5vcmVzIGZyZWN1ZW5jaWFzIGRlIHNhbGlkYSwgcGVybyBldmlkZW5jaWEgY2llcnRhICB0ZW5kZW5jaWEgYSBmYXZvcmVjZXIgZWxsby4gIFNpbiBlbWJhcmdvLCBzZSBvYnNlcnZhYmEgcXVlIGV4aXN0w61hbiBwZXJzb25hcyBxdWUgYcO6biB0ZW5pZW5kbyBtYXlvcmVzIGluZ3Jlc28gc2Fsw61hbiBtw6FzLCB5IGxvIG1pc21vIHN1Y2Vkw61hIGNvbiBsYXMgcGVyc29uYXMgcXVlIHRlbsOtYW4gbWVub3JlcyBpbmdyZXNvcyAsIHNhbMOtYW4gbWVub3MgYWxndW5vcy4gRXN0YSBhbHRhIHZhcmlhYmlsaWRhZCAoZGlzcGVyc2nDs24pIHBhcmEgbGFzIHBlcnNvbmFzIGNvbiBpbmdyZXNvcyBtYXlvcmVzIGEgMTAwMCBzb2xlcyBleHBsaWNhIHBvcnF1ZSBlbCBtb2RlbG8gZGUgcmVncmVzacOzbiBsaW5lYWwgbm8gYWp1c3RhIGNvcnJlY3RhbWVudGUgbG9zIGRhdG9zIHJlY29sZWN0YWRvcy4gQXBlc2FyIGRlIGVzdG8sIHNlIGp1c3RpZmljYSBjbGFyYW1lbnRlIHF1ZSBsYSBwZW5kaWVudGUgbmVnYXRpdmEgZGVsIG1vZGVsbyBzZSBkZWJlIGEgcXVlICBtZW5vcmVzIGZyZWN1ZW5jaWFzIHNlIGV4cGxpY2FuIHBvciBtYXlvcmVzIGluZ3Jlc29zLCBwZXJvIHF1ZSBubyByZXN1bHRhIGltcG9uZW50ZSBhbnRlIGxhIGRpc3BlcnNpw7NuIGRlIGxvcyBkYXRvcy4KCgoKIyBSZXN1bHRhZG9zIGdlbmVyYWxlcwoKLSBBbCBsbGV2YXIgYSBjYWJvIGVsIHByb2NlZGltaWVudG8gZXhwbGljYWRvIHByZXZpYW1lbnRlLCBvYnR1dmltb3MgcXVlIGxhcyBtZWRpZGFzIHF1ZSBtw6FzIGFmZWN0YXJvbiBhIGxhIGlubW92aWxpemFjacOzbiBzb2NpYWwgZnVlcm9uIGVsIGVzdGFkbyBkZSBlbWVyZ2VuY2lhIHkgbGEgYXByb2JhY2nDs24gZGVsIHBhZHLDs24gZGUgaG9nYXJlcy5BIHBhcnRpciBkZSBsYXMgcHJ1ZWJhcyBkZSBoaXDDs3Rlc2lzLCBzZSByZWNoYXphcm9uIGxhcyBoaXDDs3Rlc2lzIG51bGFzLCBwb3IgbG8gcXVlIGV4aXN0ZW4gZGlmZXJlbmNpYSBzaWduaWZpY2F0aXZhcywgZXMgZGVjaXIsIHNlIGZyZW7DsyBsYSBleHBhbnNpw7NuIGRlIGxhIGVuZmVybWVkYWQuCgotIFBvciBvdHJvIGxhZG8sIGVuIGxhIG1lZGlkYSBkZSAiU2FsaWRhIGFsdGVybmFkYSBwb3IgZ8OpbmVybyIgbm8gZXhpc3RlIGRpZmVyZW5jaWFzIHNpZ25pZmljYXRpdmFzIGVudHJlIGxvcyBkb3Mgc2V0cyBkZSBwdW50b3MuIERpY2hvIGRlIG90cm8gbW9kbywgbGEgbWVkaWRhIG5vIHR1dm8gw6l4aXRvIGVuIHJlZHVjaXIgbG9zIG51ZXZvcyBjYXNvcy4gU2kgYmllbiBlcyBjaWVydG8gZXN0YSBtZWRpZGEgZnVuY2lvbmEgYmllbiBwYXJhIGRpc21pbnVpciBsYSBtb3ZpbGl6YWNpw7NuLCBwZXJvIGNvbiBlbCBuaXZlbCBkZSBjYXNvcyBkZSBDb3ZpZC0xOSBzdWNlZGUgbG8gY29udHJhcmlvLCBkYWRvIHF1ZSBlc3RvcyBhdW1lbnRhbiBkZSBtYW5lcmEgc2lnbmlmaWNhdGl2YS4KCi0gUG9jb3MgZMOtYXMgYW50ZXJpb3JlcyBhIGxhIGltcGxlbWVudGFjacOzbiBkZSBsYSBtZWRpZGEgIlBlcm1pc28gZGUgYWRxdWlzaWNpw7NuIGRlIGJpZW5lcyB5IHNlcnZpY2lvcyBiw6FzaWNvcyIgZW4gY29uc2lkZXJhY2nDs24sIGxvcyBudWV2b3MgY2Fzb3MgZW1wZXphcm9uIGEgaW5jcmVtZW50YXIgZGVzcHXDqXMgZGUgaGFiZXJzZSBtYW50ZW5pZG8gcmVsYXRpdmFtZW50ZSBjb25zdGFudGVzIHBvciB1biB0aWVtcG8uIEVsIGluY3JlbWVudG8gZGUgZXN0b3MgbnVldm9zIGNhc29zIGFsIHBhcmVjZXIgZnVlIGNvbnRyb2xhZG8gcG9yIHVub3MgZGlhcyBwb3N0ZXJpb3JlcyBkZSBzZXIgdG9tYWRhIGxhIG1lZGlkYS4gUGFyYSBjb21wcm9iYXIgbGEgc2lnbmlmaWNhbmNpYSBkZSBlc3RhIGRpZmVyZW5jaWEsIHNlIHBsYW50ZcOzIHVuIGYtdGVzdC4gRXN0ZSBkZW1vc3Ryw7MgcXVlIG5vIHNlIHBvZHLDrWEgcmVjaGF6YXIgbGEgaGlww7N0ZXNpcyBudWxhLCBkYWRvIHF1ZSBubyBzZSBlbmNvbnRyYXJvbiBkaWZlcmVuY2lhcyBlbiBlbCByYXRpbyBkZSBhcHJpY2nDs24gZGUgbnVldm9zIGNhc29zLgoKLSBFbiBzdW1hLCBhbCByZWFsaXphciBsYSBwcnVlYmEgZGUgaGlww7N0ZXNpcyBwYXJhIGNhZGEgbWVkaWRhIHkgbGEgY2FudGlkYWQgZGUgY2Fzb3MgcG9yIGTDrWEgcHVkaW1vcyBoYWxsYXIgcXVlIGVuIGdlbmVyYWwsIGxhcyBtZWRpZGFzIGFuYWxpemFkYXMgZnVuY2lvbmFyb24gZGUgbWFuZXJhIHNhdGlzZmFjdG9yaWEuIEVzdG8gc2UgZGViZSBhIHF1ZSBhIHBlc2FyIGRlIHF1ZSBubyB0b2RhcyBpbmZsdXllcm9uIGVuIGxhIG1vdmlsaXphY2nDs24gcmVjcmVhY2lvbmFsLCBzw60gcmVkdWplcm9uIGxhIGNhbnRpZGFkIGRlIGluZmVjdGFkb3MgcG9yIGRpYSBlbiBMaW1hLgoKLSBUcmFzIHJlYWxpemFyIGxhcyBlbmN1ZXN0YXMsIHNlIGVuY29udHLDsyBxdWUgbGEgZnJlY3VlbmNpYSBkZSBzYWxpZGEgb3NjaWxhIGVudHJlIGRvcyB5IHRyZXMgdmVjZXMgYSBsYSBzZW1hbmEuIExhIG1lZGlkYSBxdWUgdHV2byBtYXlvciBhcHJvYmFjacOzbiBmdWUgbGEgaW5tb3ZpbGl6YWNpw7NuLgoKLSBQb3Igb3RyYSBwYXJ0ZSwgZXhpc3RlbiBhbGd1bmFzIHRlbmRlbmNpYXMgY3VhbmRvIHNlIGFuYWxpemFyb24gYWxndW5vcyBkZSBsb3MgZ3LDoWZpY29zIGVuIGJhc2UgYSBsYXMgcmVzcHVlc3RhcyBkZSBsb3MgZW5jdWVzdGFkb3MuIFRhbCBlcyBlbCBjYXNvLCBxdWUgc2UgcHJlc2VudGEgdW4gY29tcG9ydGFtaWVudG8gZW50cmUgbGEgdmFyaWFibGUgaW5ncmVzbyB5IGNhc29zIGluZmVjdGFkb3MuIFRhbCBlcyBlbCBjYXNvIHF1ZSBsYXMgcG9ibGFjaW9uZXMgY29uIG1lbm9yZXMgaW5ncmVzb3MsIGNvbW8gU2FuIEp1YW4gZGUgTHVyaWdhbmNobyBjb24gdW4gaW5ncmVzbyBkZSAwIGEgMTAwMCBlcyBlbCBxdWUgcHJlc2VudGEgbcOhcyBkZSBjYXRvcmNlIG1pbCBpbmZlY3RhZG9zLiBObyBvYnN0YW50ZSwgZW4gY29tcGFyYWNpw7NuIGNvbiBsb3MgZGlzdHJpdG9zIG3DoXMgcHVkaWVudGVzIGNvbW8gQmFycmFuY28gY29uIGluZ3Jlc29zIG1heW9yZXMgYSA0MDAwLCBwcmVzZW50YSBtZW5vcyBkZSBkb3MgbWlsIGNhc29zLgoKLSBPdHJhcyB0ZW5kZW5jaWFzIHF1ZSBzZSBlbmNvbnRyYXJvbiBmdWUgZW50cmUgZnJlY3VlbmNpYSBkZSBzYWxpZGEgeSB0cmFiYWpvIGluZm9ybWFsLCBkYWRvIHF1ZSBzZSBlbmNvbnRyw7MgdW5hIGNvcnJlbGFjacOzbiBiaXNlcmlhbCBwdW50dWFsIG11eSBiYWphIGxvIHF1ZSBleHBsaWNhIHVuYSBiYWphIHJlbGFjacOzbiBlbnRyZSBlc3RhcyBkb3MgdmFyaWFibGVzLiAKCi0gRWwgY29lZmljaWVudGUgcGFyYSBsYSBtZWRpZGEgZGVsIHJldGlybyBBRlAgZXMgbmVnYXRpdm8geSBiYWpvLiBFc3RvIHF1aWVyZSBkZWNpciBxdWUgZWwgY29tcG9ydGFtaWVudG8gcG9zaXRpdm8gY29ycmVzcG9uZGUgYSBsb3MgdHJhYmFqYWRvcmVzIGluZm9ybWFsZXMuIEEgbWF5b3JlcyBkaXNtaW51Y2lvbmVzIGRlIGZyZWN1ZW5jaWEgZGUgc2FsaWRhIHNlIGNvcnJlbGFjaW9uYW4gYmFqbyBjb24gbGFzIHBlcnNvbmFzIGRlIHRyYWJham8gaW5mb3JtYWwuCgotIEVudHJlIGxvcyBmYWN0b3JlcyBxdWUgbGEgcG9ibGFjacOzbiBkZXRlcm1pbsOzIHNvbiBsb3MgcXVlIGRlc2FjZWxlcmFuIGxhIHByb3BhZ2FjacOzbiBkZWwgY292aWQgLSAxOSBkZXN0YWNhbiBlbCB0b3F1ZSBkZSBxdWVkYSwgbWVkaWRhcyBwcmV2ZW50aXZhcyBzYW5pdGFyaWFzLCBpbm1vdmlsaXphY2nDs24sIGVudHJlIG90cm9zLiBEZWwgbWlzbW8gbW9kbywgbG9zIGZhY3RvcmVzIHF1ZSBhY2VsZWVyYW4gc29uIGxhIGFnbG9tZXJhY2nDs24gZGUgcGVyc29uYXMsIGZhbHRhIGRlIGVkdWNhY2nDs24sIGluZm9ybWFsaWRhZCwgc2lzdGVtYSBkZSBzYWx1ZCwgZXRjLgoKLSBUYW1iacOpbiBwdWRpbW9zIGhhbGxhciBhbGd1bmFzIGluY29uc2lzdGVuY2lhcyBlbiBsYSBpbmZvcm1hY2nDs24gYWRxdWlyaWRhLiBFc3RhcyBpbmNvbnNpc3RlbmNpYXMgcG9kcsOtYW4gcHJvdmVuaXIgZGUgYWxndW5vcyBmYWN0b3JlcyBxdWUgbm8gc2UgdG9tYXJvbiBlbiBjdWVudGEuIFBvciBlamVtcGxvLCB0b2RhcyBsYXMgbWVkaWRhcyBxdWUgbm8gc2UgY29uc2lkZXJhcm9uIHR1dmllcm9uIHVuIGVmZWN0byBhdW5xdWUgc2VhIG3DrW5pbW8gZW4gbGFzIHZhcmlhYmxlcyBhbmFsaXphZGFzLgoKLSBMYSByZWdyZXNpw7NuIG51ZXZvcyBjYXNvcyAtPiBtb3ZpbGl6YWNpw7NuIG5vIGVzIG11eSBidWVuYS4gU3UgY29lZmljaWVudGUgZGUgZGV0ZXJtaW5hY2nDs24gZXMgbXV5IHBlcXVlw7FvLiBBZGVtw6FzIGhheSBlbiBsYSBncsOhZmljYSBkZSBsb3MgcmVzaWR1b3MgaGF5IMOhcmVhcyBjb24gdmFyaW9zIHB1bnRvcy4KCgoKIyBDb25jbHVzaW9uZXMKCi0gUHVkaW1vcyByZWxhY2lvbmFyIGRpZmVyZW50ZXMgbWVkaWRhcyB0b21hZGFzIHBvciBlbCBnb2JpZXJubyBwZXJ1YW5vIGNvbiBsYSBwcm9wYWdhY2lvbiBkZWwgQ09WSUQtMTkgZGUgbWFuZXJhIHNhdGlzZmFjdG9yaWEgeSBhdmVyaWd1YXIgYSB0cmF2w6lzIGRlIHVuIHByb2NlZGltaWVudG8gZXN0YWTDrXN0aWNvIHNpIGxhIHJlbGFjacOzbiBkZSBlc3RhcyBtZWRpZGFzIGNvbiBsYSBpbm1vdmlsaXphY2nDs24gc29jaWFsIGVyYSBzaWduaWZpY2F0aXZhIG8gbm8uIFRhbWJpw6luIHB1ZGltb3MgcmVsYWNpb25hciBsYXMgbWVkaWRhcyBjb24gb3Ryb3MgZmFjdG9yZXMgY29tbyBsYSBjYW50aWRhZCBkZSBjYXNvcyBwb3IgZMOtYSBlIGluZm9ybWFjacOzbiBhZHF1aXJpZGEgYSB0cmF2ZXMgZGUgZW50cmV2aXN0YXMgeSBkYXRvcyBzYWNhZG9zIGRlIGZ1ZW50ZXMgY29uZmlhYmxlcy4KCi0gQ29tbyB5YSBzZSBtZW5jaW9ubyBhbnRlcmlvcm1lbnRlLCBmdWltb3MgY2FwYWNlcyBkZSBoYWxsYXIgbGEgcmVsYWNpw7NuIGVudHJlIGRpZmVyZW50ZXMgdmFyaWFibGVzIHJlbGFjaW9uYWRhcyBhIGxhcyBtZWRpZGFzIGVzY29naWRhcywgbGFzIGVudHJldmlzdGFzIGxsZXZhZGFzIGEgY2FibyB5IGxhIGluZm9ybWFjacOzbiBhZHF1aXJpZGEgZW4gbGEgd2ViIHkgZGVzY3Vicmltb3MgY3XDoWxlcyBkZSBlc3RhcyB2YXJpYWJsZXMgc29uIGxhcyBxdWUgdGllbmVuIG3DoXMgc2VtZWphbnphcy4KCi0gQXByZW5kaW1vcyBhIHV0aWxpemFyIEdpdGh1YiBjb21vIHVuIG1lZGlvIGRlIGNvbXVuaWNhY2nDs24gcXVlIG5vcyBheXVkYSBhIGp1bnRhciB0b2RhIGxhIGluZm9ybWFjacOzbiBkZSBtYW5lcmEgcsOhcGlkYSB5IHNlbmNpbGxhLiBFc3RvIHBlcm1pdGnDsyBxdWUgbGEgY29tdW5pY2FjacOzbiBlbnRyZSBsb3MgaW50ZWdyYW50ZXMgZGVsIGdydXBvIHNlYSBtw6FzIGZsdWlkYSB5IHN1cyBhdmFuY2VzIHNlIGludGVncmVuIGRlIG1hbmVyYSBsw7NnaWNhIHkgZW50ZW5kaWJsZSBlbiBlbCBpbmZvcm1lLgoKLSBGaW5hbG1lbnRlLCBsb2dyYW1vcyBhcHJlbmRlciB0b2RvIGxvIG5lY2VzYXJpbyBlbiBSLXN0dWRpbyBwYXJhIGxsZXZhciBhIGNhYm8gbGEgaW52ZXN0aWdhY2nDs24gZGUgbWFuZXJhIHNhdGlzZmFjdG9yaWEgeSBkZXNhcnJvbGxhciBkZXNjcmlwdG9yZXMgZ3LDoWZpY29zIHF1ZSBheXVkYW4gYSBjb21wcmVuZGVyIGRlIG1lam9yIG1hbmVyYSB0b2RvIGVsIHRyYWJham8uCgoKIyBCaWJsaW9ncmFmw61hCgoKLSBHb29nbGUgTExDLiAoMjAyMCkuIEdvb2dsZSBDT1ZJRC0xOSBDb21tdW5pdHkgTW9iaWxpdHkgUmVwb3J0cyBQZXJ1Li4gUmVjdXBlcmFkbyBlbCA3IGRlIG1heW8gZGUgMjAyMCwgZGUgR29vZ2xlIExMQyBTaXRpbyBXZWI6IGh0dHBzOi8vd3d3LmdzdGF0aWMuY29tL2NvdmlkMTkvbW9iaWxpdHkvMjAyMC0wNC0xMV9QRV9Nb2JpbGl0eV9SZXBvcnRfZW4ucGRmCi0gQW7Ds25pbW8gKDIwMjApLiBBY2Npb25lcyBhZG9wdGFkYXMgcG9yIGVsIGdvYmllcm5vIGFudGUgQ09WSUQtMTkuIFJlY3VwZXJhZG8gZWwgNyBkZSBtYXlvIGRlIDIwMjAsIGRlIFZlbG9zZSBTaXRpbyBXZWI6IGh0dHBzOi8vd3d3LnZlbG9zZS5wZS9ub3RpY2lhcy9hY2Npb25lcy1hZG9wdGFkYXMtcG9yLWVsLWdvYmllcm5vLWFudGUtY292aWQtMTkvCi0gR29iaWVybm8gZGVsIFBlcsO6ICgyMDIwKS4gTm9ybWF0aXZhIHNvYnJlIEVzdGFkbyBkZSBFbWVyZ2VuY2lhIHBvciBDb3JvbmF2aXJ1cy4gUmVjdXBlcmFkbyBlbCA3IGRlIG1heW8gZGUgMjAyMCBkZSBQbGF0YWZvcm1hIGRpZ2l0YWwgZGVsIEVzdGFkbyBQZXJ1YW5vIFNpdGlvIFdlYjogaHR0cHM6Ly93d3cuZ29iLnBlL2luc3RpdHVjaW9uL3BjbS9jb2xlY2Npb25lcy83ODctbm9ybWF0aXZhLXNvYnJlLWVzdGFkby1kZS1lbWVyZ2VuY2lhLXBvci1jb3JvbmF2aXJ1cwotIERlZmVuc29yw61hIGRlbCBQdWVibG8gKDIwMjApLiBDT01QRU5ESU8gREUgTk9STUFTIEVNSVRJREFTIFBPUiBFTCBFU1RBRE8gUEVSVUFOTyBQQVJBIEFGUk9OVEFSIExBIFBST1BBR0FDScOTTiBERUwgQ09WSUQtMTkuIFJlY3VwZXJhZG8gZWwgNyBkZSBtYXlvIGRlIDIwMjAgZGUgRGVmZW5zb3JpYSBkZWwgUHVlYmxvIFNpdGlvIFdlYjogaHR0cHM6Ly93d3cuZGVmZW5zb3JpYS5nb2IucGUvd3AtY29udGVudC91cGxvYWRzLzIwMjAvMDUvQ29tcGVuZGlvLWRlLU5vcm1hcy1DT1ZJRDE5LTA3LjA1LjIwMjAucGRmCg==